Camera2Client.cpp revision 2e19c3c02957208371cdd491e6342ea7ddb440d9
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
3968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    Mutex::Autolock iccl(mICameraClientLock);
3979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = 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()) {
4368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
4378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
44661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
450a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
452ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4533a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
455ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
46336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
46461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
468a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4699e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
470ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4713a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
473ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
48036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
48336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
485a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4899e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
4909e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
4916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
512cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
517d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
526be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
533bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
534be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
535bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
54161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
544a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
545228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
546ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
548228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
549228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
552228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
553228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
554228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
555228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
556228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
558228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
559228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
560228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
561228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
562228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
564228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
565228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
568228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
58061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
58161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
58261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
583a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5849e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
585ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
591ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
5946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state >= Parameters::PREVIEW && !restart) {
5964ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
5994ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6004ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
602be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updatePreviewStream(params);
609be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
610be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
611be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
612be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateCallbackStream(params);
618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
621228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
623228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
625cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
626228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updatePreviewRequest(params);
627be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
6326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] =
636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                { mPreviewStreamId, mCallbackStreamId };
637cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
641cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        uint8_t outputStreams[1] = { mPreviewStreamId };
642cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mPreviewRequest.update(
643228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
644cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                outputStreams, 1);
645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
6466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
6486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
651cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mPreviewRequest.sort();
652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
653be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
6596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
660bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
661bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
66861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
66961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
67061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
671a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6729e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
673ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
67636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
677ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
678ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
67936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
680ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
682228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
685228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
686228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
687228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
689d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
690d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
691d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
693d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
695d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
696d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
697d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
699228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break - identical to preview
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
701cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
7022267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
708d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
711d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
712228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
713d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
71461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
71561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
71661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
717a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
718ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7203a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7213a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
72461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
72561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
72661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
727a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
728ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7303a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7313a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
73678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
73978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
74078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
74178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
74278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
74378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
74478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
74678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
74778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
74861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
74961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
75061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
751a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7529e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
753ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
757228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
759228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
7603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
761228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
762228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
763228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
765228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
7669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
7679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
7699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
7709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
773228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
774228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
775228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
7769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
7819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
784228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
78578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
78678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
78778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
78878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
78978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
79078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updateRecordingStream(params);
7929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
7949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
7969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
798228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
799228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateCallbackStream(params);
801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
802228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
804228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
805228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
806228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
808cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
809228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRecordingRequest(params);
8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
8149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
8159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[3] =
819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                { mPreviewStreamId, mRecordingStreamId, mCallbackStreamId };
820cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 3);
823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
824228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
825cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
827228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
828228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
834cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mRecordingRequest.sort();
8359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
8379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
8459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
8469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
850228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
85361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
85461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
85561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
856a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8579e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
858ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
860228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8623a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
8633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
8679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
8729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
8742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
8809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
8819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::PREVIEW;
89261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
89361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
89461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
895a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
896ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8978da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
8983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
8993a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9008da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9018da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9028da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9038da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9048da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9068da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
90961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
91061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
91161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
912a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
913ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
91630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
91830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
9209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
9219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
9229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
9239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
9279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
92978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
93078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
93178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
93278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
93378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
93478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
93578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
93630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
93730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    // Release the buffer back to the recording queue
93830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
93930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
94030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
94130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    size_t itemIndex;
94230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
94330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
94430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
94530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                item.mGraphicBuffer->handle == imgHandle) {
94630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            break;
94730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        }
94830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
94930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    if (itemIndex == mRecordingBuffers.size()) {
95030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
95130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
95230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        return;
95330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
95430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
95630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            imgHandle);
95730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
95830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
95978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
96078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
96178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
96230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
96378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
96478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
96530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    mRecordingBuffers.replaceAt(itemIndex);
96678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
96861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
96961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
97061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
971a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
972ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
976174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
977174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
9802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
981174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
982174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
983174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
984174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
9856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
98661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
98761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
98861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
989a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
990ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9913a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
994174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
995174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
998174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
999174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1000174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1001174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
100361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
100461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
100561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
1006a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1007ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1008d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
10093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1010d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
10152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1016d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1017d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1018d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
10202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
1021d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
1022d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
1026d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1027d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1028d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1031d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateCaptureStream(l.mParameters);
1033228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1034228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1035228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1036228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return res;
1037228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1039cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
10402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        res = updateCaptureRequest(l.mParameters);
10414ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
1042228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
1043228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
10444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
10454ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
1046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1047d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool callbacksEnabled = l.mParameters.previewCallbackFlags &
1049228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
10502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool recordingEnabled = (l.mParameters.state == Parameters::RECORD);
1051228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1052228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    int streamSwitch = (callbacksEnabled ? 0x2 : 0x0) +
1053228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            (recordingEnabled ? 0x1 : 0x0);
1054228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch ( streamSwitch ) {
1055228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 0: { // No recording, callbacks
1056228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
1057cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1058cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 2);
1059228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1060228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1061228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 1: { // Recording
1062228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId,
1063228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mCaptureStreamId };
1064cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1065cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1066228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1067228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1068228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 2: { // Callbacks
1069228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[3] = { mPreviewStreamId, mCallbackStreamId,
1070228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mCaptureStreamId };
1071cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1072cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 3);
1073228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1074228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1075228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case 3: { // Both
1076228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            uint8_t streamIds[4] = { mPreviewStreamId, mCallbackStreamId,
1077228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                                     mRecordingStreamId, mCaptureStreamId };
1078cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
1079cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                    streamIds, 4);
1080228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
1081228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1082228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    };
1083d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1084d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
1085d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1086d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1087d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1088d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1089cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.sort();
1090be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1091be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
1092be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1093be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1094be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1095d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1096cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
1097cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
1098d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
1099d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
1100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
1101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::PREVIEW) {
1104cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mDevice->clearStreamingRequest();
1105d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1106d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
1107d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
1108d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1109d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
1110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1111d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
11129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
1113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1115d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
1117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1118d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
1119d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
11222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
11232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STILL_CAPTURE;
11242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            res = commandStopFaceDetectionL(l.mParameters);
11258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            if (res != OK) {
11268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
11278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                        __FUNCTION__, mCameraId);
11288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
11298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
1130d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
11322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1133d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
1134d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
1135d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
1136d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1137d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1138d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1139d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1140d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
114161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
114261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
114361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1144a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11459e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1146ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
11483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
11532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
11549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
115861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
116061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1161a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1162ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11633a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1164ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1166ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.paramsFlattened;
116961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
117061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
117161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1172a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1173ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1176c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1177c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1178c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1179c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
118036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
118136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
118236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
118336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
118436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
118536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
118636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
118736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
118836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
118936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
119036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
119136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
119236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1193228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
11952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1196228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
119736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
119836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
120036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
120336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
120436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
120536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1206c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
121336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
121536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
121836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
122036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
122236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
123036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mPreviewStreamId != NO_STREAM) {
123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mDevice->setStreamTransform(mPreviewStreamId, transform);
123236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
123636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
123936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1241c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
124236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1243983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
124436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
124536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
124636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
124736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
124836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
124936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
125036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
125136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
125236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
125336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
125436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1255983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
125636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1257983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
125936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
126036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1261983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
126236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
126336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
126436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
126536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
126636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
126736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
12688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
12698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
12778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
12788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
12798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
12838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
12848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
12858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_STATS_FACE_DETECTION_OFF) {
12898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
12908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
12918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
12928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
12948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
12968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
12988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
130036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
130136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1302228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
13038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
13048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
13058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
13068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1307228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
13088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1309228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
13108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1314228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
13158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
131836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
131936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
132036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1323174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
132436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
132536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
132636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
132736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
132836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1331983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
133236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
133336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
133436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
133536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
133636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
133736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
13388da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
133936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
134036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
134136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1342c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1343c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // 32 is the current upper limit on the video buffer count for BufferQueue
134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (count > 32) {
134636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
134736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, count);
134836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
134936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Need to reallocate memory for heap
135236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mRecordingHeapCount != count) {
135336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if  (mRecordingHeap != 0) {
135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap.clear();
135536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap = NULL;
135636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        }
135736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mRecordingHeapCount = count;
135836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1359c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
13606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
136161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
136261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
13643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1365160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1366160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1367160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1368160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1369160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1370160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1371160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1372160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1373160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1374160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1375160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1376160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
13842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1389174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1391174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
13972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1398174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1410174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1415174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1420174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1422174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1423174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
14242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1425174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1429174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1430174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1432174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1433174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1434174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1436174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1439174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1440174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1441174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1442174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1443174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1444174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1445174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1446174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1447174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1449174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1450174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1451174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1452174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1454174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1455174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1456174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1457174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1458174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1459174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1460174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d (ID %d) in focus mode %d",
14612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                          __FUNCTION__, newState, triggerId, l.mParameters.focusMode);
1462174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1463174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1464174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1465174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
14668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
14678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (mCameraClient != 0) {
14688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
14698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
14708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1471174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1472603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
14738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
14748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (mCameraClient != 0) {
14758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            mCameraClient->notifyCallback(CAMERA_MSG_FOCUS, success ? 1 : 0, 0);
14768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1477603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1478160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1479160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1480160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1481160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1483160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1484160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1485160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1486160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1487160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1488160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1489160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1490c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville TalvalaCamera2Client::FrameProcessor::FrameProcessor(wp<Camera2Client> client):
1491c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        Thread(false), mClient(client) {
1492c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1493c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1494c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville TalvalaCamera2Client::FrameProcessor::~FrameProcessor() {
1495c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
1496c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1497c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1498c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalavoid Camera2Client::FrameProcessor::dump(int fd, const Vector<String16>& args) {
1499c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    String8 result("    Latest received frame:\n");
1500c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    write(fd, result.string(), result.size());
1501c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mLastFrame.dump(fd, 2, 6);
1502c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1503c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1504c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalabool Camera2Client::FrameProcessor::threadLoop() {
1505c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    status_t res;
1506c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1507c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    sp<Camera2Device> device;
1508c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    {
1509c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        sp<Camera2Client> client = mClient.promote();
1510c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        if (client == 0) return false;
1511c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        device = client->mDevice;
1512c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    }
1513c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1514c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    res = device->waitForNextFrame(kWaitDuration);
1515c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    if (res == OK) {
1516c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        sp<Camera2Client> client = mClient.promote();
1517c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        if (client == 0) return false;
1518c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        processNewFrames(client);
1519c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    } else if (res != TIMED_OUT) {
1520c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        ALOGE("Camera2Client::FrameProcessor: Error waiting for new "
1521c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                "frames: %s (%d)", strerror(-res), res);
1522c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    }
1523c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1524c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    return true;
1525c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1526c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1527c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalavoid Camera2Client::FrameProcessor::processNewFrames(sp<Camera2Client> &client) {
15288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
1529cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    CameraMetadata frame;
1530c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    while ( (res = client->mDevice->getNextFrame(&frame)) == OK) {
1531cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        camera_metadata_entry_t entry;
1532cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry = frame.find(ANDROID_REQUEST_FRAME_COUNT);
1533cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (entry.count == 0) {
1534cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Camera %d: Error reading frame number: %s (%d)",
1535c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId, strerror(-res), res);
1536cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            break;
15378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
15388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1539c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        res = processFaceDetect(frame, client);
1540cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (res != OK) break;
1541c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1542c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala        mLastFrame.acquire(frame);
1543cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    }
1544cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (res != NOT_ENOUGH_DATA) {
1545cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        ALOGE("%s: Camera %d: Error getting next frame: %s (%d)",
1546c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                __FUNCTION__, client->mCameraId, strerror(-res), res);
1547cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        return;
15488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
1549cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
15508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return;
15518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1553c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvalastatus_t Camera2Client::FrameProcessor::processFaceDetect(
1554c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    const CameraMetadata &frame, sp<Camera2Client> &client) {
15558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
1556cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t entry;
15578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    bool enableFaceDetect;
15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int maxFaces;
15598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    {
15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(client->mParameters);
15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        enableFaceDetect = l.mParameters.enableFaceDetect;
15628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
1563cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    entry = frame.find(ANDROID_STATS_FACE_DETECT_MODE);
1564cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
1565cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    // TODO: This should be an error once implementations are compliant
1566cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (entry.count == 0) {
156776dc8dacbb3e2a8c91cb526293270f9093cf8f8bEino-Ville Talvala        return OK;
15688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
1569cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
15708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    uint8_t faceDetectMode = entry.data.u8[0];
15718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_frame_metadata metadata;
15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Vector<camera_face_t> faces;
15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    metadata.number_of_faces = 0;
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (enableFaceDetect && faceDetectMode != ANDROID_STATS_FACE_DETECTION_OFF) {
15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(client->mParameters);
1578cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry = frame.find(ANDROID_STATS_FACE_RECTANGLES);
1579cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (entry.count == 0) {
1580cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to read face rectangles",
1581c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId);
15828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
15848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        metadata.number_of_faces = entry.count / 4;
15858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (metadata.number_of_faces >
15862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.fastInfo.maxFaces) {
15878ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: More faces than expected! (Got %d, max %d)",
1588c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId,
15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    metadata.number_of_faces, l.mParameters.fastInfo.maxFaces);
15908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1592cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *faceRects = entry.data.i32;
15938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1594cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        entry = frame.find(ANDROID_STATS_FACE_SCORES);
1595cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        if (entry.count == 0) {
1596cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to read face scores",
1597c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                    __FUNCTION__, client->mCameraId);
15988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1600cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const uint8_t *faceScores = entry.data.u8;
16018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1602cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *faceLandmarks = NULL;
1603cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        const int32_t *faceIds = NULL;
16048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (faceDetectMode == ANDROID_STATS_FACE_DETECTION_FULL) {
1606cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            entry = frame.find(ANDROID_STATS_FACE_LANDMARKS);
1607cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            if (entry.count == 0) {
1608cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to read face landmarks",
1609c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        __FUNCTION__, client->mCameraId);
16108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
16118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
16128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            faceLandmarks = entry.data.i32;
16138ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1614cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            entry = frame.find(ANDROID_STATS_FACE_IDS);
1615cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala
1616cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            if (entry.count == 0) {
1617cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to read face IDs",
1618c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                        __FUNCTION__, client->mCameraId);
16198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                return res;
16208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
16218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            faceIds = entry.data.i32;
16228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        faces.setCapacity(metadata.number_of_faces);
16258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        for (int i = 0; i < metadata.number_of_faces; i++) {
16278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            camera_face_t face;
16288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            face.rect[0] = l.mParameters.arrayXToNormalized(faceRects[i*4 + 0]);
16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            face.rect[1] = l.mParameters.arrayYToNormalized(faceRects[i*4 + 1]);
16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            face.rect[2] = l.mParameters.arrayXToNormalized(faceRects[i*4 + 2]);
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            face.rect[3] = l.mParameters.arrayYToNormalized(faceRects[i*4 + 3]);
16338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            face.score = faceScores[i];
16358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            if (faceDetectMode == ANDROID_STATS_FACE_DETECTION_FULL) {
16368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.id = faceIds[i];
1637c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.left_eye[0] =
16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.arrayXToNormalized(faceLandmarks[i*6 + 0]);
1639c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.left_eye[1] =
16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.arrayYToNormalized(faceLandmarks[i*6 + 1]);
1641c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.right_eye[0] =
16422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.arrayXToNormalized(faceLandmarks[i*6 + 2]);
1643c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.right_eye[1] =
16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.arrayYToNormalized(faceLandmarks[i*6 + 3]);
1645c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.mouth[0] =
16462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.arrayXToNormalized(faceLandmarks[i*6 + 4]);
1647c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala                face.mouth[1] =
16482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.arrayYToNormalized(faceLandmarks[i*6 + 5]);
16498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            } else {
16508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.id = 0;
16518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.left_eye[0] = face.left_eye[1] = -2000;
16528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.right_eye[0] = face.right_eye[1] = -2000;
16538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                face.mouth[0] = face.mouth[1] = -2000;
16548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            }
16558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            faces.push_back(face);
16568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        metadata.faces = faces.editArray();
16592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (metadata.number_of_faces != 0) {
16622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Mutex::Autolock iccl(client->mICameraClientLock);
16632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (client->mCameraClient != NULL) {
16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            client->mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_METADATA,
16652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    NULL, &metadata);
16668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return OK;
16698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
16708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1671228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCallbackAvailable() {
1672d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1673d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1674228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Preview callback available", __FUNCTION__, mCameraId);
1675228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1676228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    int callbackHeapId;
1677228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> callbackHeap;
1678228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    size_t heapIdx;
16799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1680d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
1681228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Getting buffer", __FUNCTION__);
1682228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = mCallbackConsumer->lockNextBuffer(&imgBuffer);
1683228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1684228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Error receiving next callback buffer: "
1685228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1686228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return;
1687228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1688228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1689d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
16902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
1691d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
16922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if ( l.mParameters.state != Parameters::PREVIEW
16932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                && l.mParameters.state != Parameters::RECORD
16942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                && l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1695228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: No longer streaming",
1696228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1697228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1698228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1699228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1700228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
17012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (! (l.mParameters.previewCallbackFlags &
1702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ) {
1703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: No longer enabled, dropping", __FUNCTION__);
1704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1705228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
17072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if ((l.mParameters.previewCallbackFlags &
1708228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) &&
17092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                !l.mParameters.previewCallbackOneShot) {
1710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: One shot mode, already sent, dropping", __FUNCTION__);
1711228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1712228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1713228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1714228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
17152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (imgBuffer.format != l.mParameters.previewFormat) {
1716228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for callback: "
1717228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
17182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    imgBuffer.format, l.mParameters.previewFormat);
1719228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1720228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1721228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1722228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1723228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t bufferSize = calculateBufferSize(imgBuffer.width, imgBuffer.height,
1724228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                imgBuffer.format, imgBuffer.stride);
1725228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t currentBufferSize = (mCallbackHeap == 0) ?
1726228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                0 : (mCallbackHeap->mHeap->getSize() / kCallbackHeapCount);
1727228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (bufferSize != currentBufferSize) {
1728228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap.clear();
1729228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap = new Camera2Heap(bufferSize, kCallbackHeapCount,
1730228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "Camera2Client::CallbackHeap");
1731228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (mCallbackHeap->mHeap->getSize() == 0) {
1732228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for callbacks",
1733228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1734228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                mCallbackConsumer->unlockBuffer(imgBuffer);
1735228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                return;
1736228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
1737228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1738228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapHead = 0;
1739228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapFree = kCallbackHeapCount;
1740228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeapId++;
1741228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1742228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1743228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (mCallbackHeapFree == 0) {
1744228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: No free callback buffers, dropping frame",
1745d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1746228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->unlockBuffer(imgBuffer);
1747d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1748d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1749228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        heapIdx = mCallbackHeapHead;
1750228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        callbackHeap = mCallbackHeap;
1751228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        callbackHeapId = mCallbackHeapId;
1752228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1753228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapHead = (mCallbackHeapHead + 1) & kCallbackHeapCount;
1754228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapFree--;
1755228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1756228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Get rid of this memcpy by passing the gralloc queue all the way
1757228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // to app
1758228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1759228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ssize_t offset;
1760228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        size_t size;
1761228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        sp<IMemoryHeap> heap =
1762228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackHeap->mBuffers[heapIdx]->getMemory(&offset,
1763228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    &size);
1764228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
1765228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        memcpy(data, imgBuffer.data, bufferSize);
1766228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1767228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: Freeing buffer", __FUNCTION__);
1768228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->unlockBuffer(imgBuffer);
1769228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1770228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // In one-shot mode, stop sending callbacks after the first one
17712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.previewCallbackFlags &
1772228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
1773228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: clearing oneshot", __FUNCTION__);
17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.previewCallbackOneShot = false;
1775228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1776228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1777228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1778228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside parameter lock to allow re-entrancy from notification
1779228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
1780228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        Mutex::Autolock iccl(mICameraClientLock);
1781228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (mCameraClient != 0) {
1782228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Invoking client data callback",
1783228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1784228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_FRAME,
1785228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    callbackHeap->mBuffers[heapIdx], NULL);
1786228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1787228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1788228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
17892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1790228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Only increment free if we're still using the same heap
1791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackHeapId == callbackHeapId) {
1792228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackHeapFree++;
1793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1794228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1795228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: exit", __FUNCTION__);
1796228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
1797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1798228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
1799228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ATRACE_CALL();
1800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
1801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> captureHeap;
1802228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId);
1803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1804228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
18052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
1806228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CpuConsumer::LockedBuffer imgBuffer;
1807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1809d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1811d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1813d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1814d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1815228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.state != Parameters::STILL_CAPTURE &&
18172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return;
1822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1824d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1825d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
1826d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
1827d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
1828d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
1829d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1830d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
18349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void* captureMemory = mCaptureHeap->mHeap->getBase();
18359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size = mCaptureHeap->mHeap->getSize();
1836d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
1837d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1838d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
1839d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
18402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.state) {
18412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
18422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
1843d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
18442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
18452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
1846d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1847d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
1848d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
18492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        mCameraId, l.mParameters.state);
1850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1851d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
18528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1853228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        captureHeap = mCaptureHeap;
1854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1855228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside parameter locks to allow re-entrancy from notification
1856228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    Mutex::Autolock iccl(mICameraClientLock);
1857228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCameraClient != 0) {
1858228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1859228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                captureHeap->mBuffers[0], NULL);
18609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
18629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
18649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
18659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1866228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> recordingHeap;
18679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
18689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
18699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
18702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
18719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
187230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        BufferItemConsumer::BufferItem imgBuffer;
187330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        res = mRecordingConsumer->acquireBuffer(&imgBuffer);
18749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
18759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
18769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
18779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
18789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
187930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        timestamp = imgBuffer.mTimestamp;
18809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1881228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount++;
1882228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1883228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1884228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
18852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.state != Parameters::RECORD &&
18862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1887228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1888228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "recording done",
1889228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
189030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
18919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
18929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1893898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
189478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
189578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
18969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
18979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
1898983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                    mRecordingHeapCount, bufferSize);
18999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1900983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
19019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
19029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
19039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
19049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
190530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingConsumer->releaseBuffer(imgBuffer);
19069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
19079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
190830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
190930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                if (mRecordingBuffers[i].mBuf !=
191030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                        BufferItemConsumer::INVALID_BUFFER_SLOT) {
191130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    ALOGE("%s: Camera %d: Non-empty recording buffers list!",
191230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                            __FUNCTION__, mCameraId);
191330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
191430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
191530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.clear();
191630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.setCapacity(mRecordingHeapCount);
191730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.insertAt(0, mRecordingHeapCount);
191830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
19199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
1920983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeapFree = mRecordingHeapCount;
19219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
19229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
19249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
19259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
192630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
19279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
19289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1929228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
19309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
1931983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
19329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
19339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
19359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
19369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
19379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
19389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
19399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
19409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
19419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
19429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
194378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
194478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
194530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((uint32_t*)data) = type;
194630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
194778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
194830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
194930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
1950228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        recordingHeap = mRecordingHeap;
19519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
1952228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1953228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside locked parameters to allow re-entrancy from notification
1954228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    Mutex::Autolock iccl(mICameraClientLock);
1955228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCameraClient != 0) {
1956228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCameraClient->dataCallbackTimestamp(timestamp,
19579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
1958228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                recordingHeap->mBuffers[heapIdx]);
1959d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1960d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1961d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
19623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
19633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::updateRequests(const Parameters &params) {
19658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
19668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
19678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updatePreviewRequest(params);
19688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
19698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
19708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
19728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
19738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateCaptureRequest(params);
19748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
19758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
19768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
19788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
19798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
19808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRecordingRequest(params);
19818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
19828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
19838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
19858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
19868ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
19872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
19888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
19898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
19908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
19918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
19928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
19938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
19942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
19952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
19968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
19978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
19988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
19998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
20008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
20018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
20028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
20038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
20048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
20058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2006836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
2007be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2008be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2009836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
2010be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
2011be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
2012be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
2013be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
2014be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
2015be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2016be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
2017be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2018be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2019be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2020836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
2021836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
20229e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
20239e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
2024836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
2025be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
2026be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2027be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
2028be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2029be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2030be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2031be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
2032be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2033be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2034be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
2035be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
2036be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2037be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2038be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
2039be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2040be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2041be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2042be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
2043be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
2044836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
2045be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
2046be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
2047be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2048be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
2049be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
2050be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2051be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2052be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2053be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2054c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
2055836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
2056c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
2057c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
2058c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2059c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
2060c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
2061c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
2062be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2063be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2064be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2065836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
2066a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
20676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
2068cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
20696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
20706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
20716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
20726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
20736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
20746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
20756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
20766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2077be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2078cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mPreviewRequest, params);
2079be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2080be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
2081be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2082be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2083be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2084be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2085be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
20866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
20876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
20886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2089228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::updateCallbackStream(const Parameters &params) {
2090228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
2091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackConsumer == 0) {
2093228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint
2094228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer = new CpuConsumer(kCallbackHeapCount);
2095228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackWaiter = new CallbackWaiter(this);
2096228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->setFrameAvailableListener(mCallbackWaiter);
2097228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackConsumer->setName(String8("Camera2Client::CallbackConsumer"));
2098228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mCallbackWindow = new SurfaceTextureClient(
2099228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackConsumer->getProducerInterface());
2100228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2101228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2102228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId != NO_STREAM) {
2103228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Check if stream parameters have to change
2104228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        uint32_t currentWidth, currentHeight, currentFormat;
2105228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = mDevice->getStreamInfo(mCallbackStreamId,
2106228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                &currentWidth, &currentHeight, &currentFormat);
2107228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
2108228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying callback output stream info: "
2109228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2110228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
2111228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2112228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
2113228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight ||
2114228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                currentFormat != (uint32_t)params.previewFormat) {
2115228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // Since size should only change while preview is not running,
2116228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // assuming that all existing use of old callback stream is
2117228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // completed.
2118228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = mDevice->deleteStream(mCallbackStreamId);
2119228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (res != OK) {
2120228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2121228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        "for callbacks: %s (%d)", __FUNCTION__, mCameraId,
2122228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                        strerror(-res), res);
2123228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                return res;
2124228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            }
2125228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            mCallbackStreamId = NO_STREAM;
2126228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2127228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2128228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2129228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (mCallbackStreamId == NO_STREAM) {
2130228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("Creating callback stream: %d %d format 0x%x",
2131228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewWidth, params.previewHeight,
2132228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewFormat);
2133228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = mDevice->createStream(mCallbackWindow,
2134228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewWidth, params.previewHeight,
2135228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                params.previewFormat, 0, &mCallbackStreamId);
2136228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
2137228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for callbacks: "
2138228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2139228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
2140228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2141228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2142228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2143228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    return OK;
2144228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
2145228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2146228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
2147836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureStream(const Parameters &params) {
2148be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2149d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2150d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
2151cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxJpegSize =
21522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            mParameters.staticInfo(ANDROID_JPEG_MAX_SIZE);
2153d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
2154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
2156d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
2157d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2158d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2159d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
2160d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
2161d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
2162d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2163d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2164d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
2165d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
2166d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
21679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1,
21689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                       "Camera2Client::CaptureHeap");
21699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mCaptureHeap->mHeap->getSize() == 0) {
2170d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2171d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2172d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
2173d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2174d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2175d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2176be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
2177d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
2178d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
2179d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
2180d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
2181d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2182d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2183d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2184d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2185d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2186836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.pictureWidth ||
2187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.pictureHeight) {
2188d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
2189d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
2190d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2191d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2192d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
2193d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
2194d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
2195d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
2196d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2197d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2198be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2199be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
2200be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Create stream for HAL production
2201be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
2202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.pictureWidth, params.pictureHeight,
2203be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2204be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mCaptureStreamId);
2205be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2206be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2207be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2208be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2209be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2210be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2211be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2212d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2213d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2214be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2215836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest(const Parameters &params) {
2216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2218cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
2219d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2220d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
2221d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2222d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
2223d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2224d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2225d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2226d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2227be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2228cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mCaptureRequest, params);
2229be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2230be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
2231be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2232be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2233be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2234be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2235be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2236cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE,
2237836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.jpegThumbSize, 2);
2238be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2239cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
2240836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegThumbQuality, 1);
2241be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2242cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_QUALITY,
2243836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegQuality, 1);
2244be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2245cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mCaptureRequest.update(
2246be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2247836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.jpegRotation, 1);
2248be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2249be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.gpsEnabled) {
2251cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
2252be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2253836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.gpsCoordinates, 3);
2254be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2255cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
2256be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2257836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.gpsTimestamp, 1);
2258be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2259cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.update(
2260be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2261cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala                params.gpsProcessingMethod);
2262be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2263be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2264cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES);
2265be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2266cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP);
2267be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2268cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
2269be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2270be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2271be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2272d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2273d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2274d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2275836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
22769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
22779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
2278cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
22799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
22809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
22819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
22829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
22839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
22849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
22859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
22869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
22879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2288cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = updateRequestCommon(&mRecordingRequest, params);
22899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
22909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
22919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
22929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
22939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
22949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
22959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
22969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
22979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
22989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
23009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
23019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
23029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
2303228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint. We need one more buffer here so that we can
2304228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // always acquire and free a buffer when the heap is full; otherwise the consumer
2305228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // will have buffers in flight we'll never clear out.
230630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingConsumer = new BufferItemConsumer(
230730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                GRALLOC_USAGE_HW_VIDEO_ENCODER,
230830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingHeapCount + 1,
230930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                true);
23109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
23119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
23129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
23139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
23149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
23159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
23169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
23179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
23189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
23199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
23209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
23219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
23229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
23239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
23249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
23259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
23269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
2327836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
2328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
23299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
23309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
23319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
23329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
23339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
23349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
23359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
23369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
23379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
23389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
23399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
23409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
23419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
2342228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount = 0;
23439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
2344836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
234578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
23469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
23479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
23489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
23499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
23509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
23519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
23529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
23539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
23549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
23559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2356cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(CameraMetadata *request,
23572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const Parameters &params) const {
2358be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2359be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2360cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
2361cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            params.previewFpsRange, 2);
2362be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2364836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t wbMode = params.autoWhiteBalanceLock ?
2365cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            (uint8_t)ANDROID_CONTROL_AWB_LOCKED : params.wbMode;
2366cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
2367cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &wbMode, 1);
2368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2369cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
2370cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &params.effectMode, 1);
2371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2372cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
2373836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.antibandingMode, 1);
2374be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2375be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2376be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
2377836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            (params.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
2378be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
2379cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
2380cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &controlMode, 1);
2381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
2383cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_SCENE_MODE,
2384836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                &params.sceneMode, 1);
2385be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2386be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2387be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2388be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
2389be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
2390836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.flashMode) {
2391be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
2392be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
2393be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
2394be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
2395be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
2396be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
2397be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
2398be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
2399be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
2400be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2401be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
2402be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
2403be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2404be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
2405836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.flashMode);
2406be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2407be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2408836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
2409be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2410cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
2411cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &flashMode, 1);
2412be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2413cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
2414cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &aeMode, 1);
2415be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2416be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2417be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
2418be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
2419836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (params.focusMode) {
2420be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
2421be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
2422be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
2423be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
2424be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
2425836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            focusMode = params.focusMode;
2426be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2427be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
2428be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
2429be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
2430be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2431be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2432be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
2433836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    mCameraId, params.focusMode);
2434be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2435be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2436cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
2437cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusDistance, 1);
2438be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2439cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
2440cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            &focusMode, 1);
2441be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2442be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2443836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t focusingAreasSize = params.focusingAreas.size() * 5;
2444be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
2445be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
2446f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        if (params.focusingAreas[i].weight != 0) {
24472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 0] =
24482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedXToArray(params.focusingAreas[i].left);
24492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 1] =
24502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedYToArray(params.focusingAreas[i].top);
24512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 2] =
24522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedXToArray(params.focusingAreas[i].right);
24532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            focusingAreas[i + 3] =
24542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    params.normalizedYToArray(params.focusingAreas[i].bottom);
2455f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        } else {
2456f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 0] = 0;
2457f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 1] = 0;
2458f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 2] = 0;
2459f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            focusingAreas[i + 3] = 0;
2460f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        }
2461836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        focusingAreas[i + 4] = params.focusingAreas[i].weight;
2462be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2463cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
2464cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            focusingAreas,focusingAreasSize);
2465be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2466be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
2467be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2468cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_EXP_COMPENSATION,
2469836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            &params.exposureCompensation, 1);
2470be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2471be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2472836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    size_t meteringAreasSize = params.meteringAreas.size() * 5;
2473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
2474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
2475f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        if (params.meteringAreas[i].weight != 0) {
2476f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 0] =
24772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedXToArray(params.meteringAreas[i].left);
2478f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 1] =
24792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedYToArray(params.meteringAreas[i].top);
2480f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 2] =
24812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedXToArray(params.meteringAreas[i].right);
2482f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 3] =
24832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                params.normalizedYToArray(params.meteringAreas[i].bottom);
2484f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        } else {
2485f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 0] = 0;
2486f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 1] = 0;
2487f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 2] = 0;
2488f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            meteringAreas[i + 3] = 0;
2489f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala        }
2490836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        meteringAreas[i + 4] = params.meteringAreas[i].weight;
2491be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2492cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
2493cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
2494be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2495be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2496cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2497cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            meteringAreas, meteringAreasSize);
2498be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2499be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
2500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2501be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
2502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
2503be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2504cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
25052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            mParameters.staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
2506be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
25072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (params.NUM_ZOOM_STEPS-1);
2508836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * params.zoom;
2509be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2510be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2511836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (params.previewWidth >= params.previewHeight) {
25122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        zoomWidth =  params.fastInfo.arrayWidth / zoomRatio;
2513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
2514836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewHeight / params.previewWidth;
2515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
25162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        zoomHeight = params.fastInfo.arrayHeight / zoomRatio;
2517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
2518836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth / params.previewHeight;
2519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
25202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoomLeft = (params.fastInfo.arrayWidth - zoomWidth) / 2;
25212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoomTop = (params.fastInfo.arrayHeight - zoomHeight) / 2;
2522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
2524cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
2525cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            cropRegion, 3);
2526be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
2529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2530836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    uint8_t vstabMode = params.videoStabilization ?
2531be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
2532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
2533cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2534be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
2535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
25378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    uint8_t faceDetectMode = params.enableFaceDetect ?
25382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.fastInfo.bestFaceDetectMode :
25398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            (uint8_t)ANDROID_STATS_FACE_DETECTION_OFF;
2540cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = request->update(ANDROID_STATS_FACE_DETECT_MODE,
25418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            &faceDetectMode, 1);
25428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) return res;
25438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
2544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2547228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
2548228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
2549228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
2550228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2551228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2552228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2553228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
2554228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2555228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2556228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
2557228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
2558f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
2559228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
2560228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
2561228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2562228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
2563228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2564228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
2565228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
2566228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
2567228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2568228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
2569228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
2570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
2571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
2572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
25748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
257561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
2576