Camera2Client.cpp revision da6665cbd06ca58d3357c3002b7366d13e23f152
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Client"
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/SurfaceTextureClient.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala#include <media/hardware/MetadataBufferType.h>
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2;
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
54f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
55ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mSharedCameraClient(cameraClient),
562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        mParameters(cameraId, cameraFacing),
57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId(NO_STREAM),
589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingStreamId(NO_STREAM),
59983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapCount(kDefaultRecordingHeapCount)
60f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
61a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Opened", cameraId);
6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
65228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    property_get("camera.zsl_mode", value, "0");
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!strcmp(value,"1")) {
72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGI("Camera %d: Enabling ZSL mode", cameraId);
73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        l.mParameters.zslMode = true;
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        l.mParameters.zslMode = false;
76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvalastatus_t Camera2Client::checkPid(const char* checkLocation) const {
803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    int callingPid = getCallingPid();
813a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if (callingPid == mClientPid) return NO_ERROR;
823a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
833a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    ALOGE("%s: attempt to use a locked camera from a different process"
843a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
853a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    return PERMISSION_DENIED;
863a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala}
873a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
90a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
91c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
93f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
94f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
101174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    res = mDevice->setNotifyCallback(this);
102174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.initialize(&(mDevice->info()));
106f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
107f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
110f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 threadName;
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
114ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    mFrameProcessor = new FrameProcessor(this);
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    threadName = String8::format("Camera2Client[%d]::FrameProcessor",
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    threadName = String8::format("Camera2Client[%d]::CaptureSequencer",
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    threadName = String8::format("Camera2Client[%d]::JpegProcessor",
126ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
128ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    threadName = String8::format("Camera2Client[%d]::ZslProcessor",
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor->run(threadName.string());
133ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
134d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    threadName = String8::format("Camera2Client[%d]::CallbackProcessor",
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
138d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
140f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
141f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
143f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
144f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
14661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
149a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
1514ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    // Rewrite mClientPid to allow shutdown by CameraService
1553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mClientPid = getCallingPid();
156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
157c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
158c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->requestExit();
159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
16061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
163611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
165611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
166611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
167611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1754ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
177836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
181836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
18211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
183836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
185836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
196836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
204836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
217836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
231836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
240836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
262836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
273836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
286836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
289836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
290836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
292836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
300836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
3017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
303836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
309836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3163297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3193297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
320836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3223297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
325ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
327da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
3293297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3303297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
331cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() != 0) {
3323297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
3333297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
334cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mPreviewRequest.dump(fd, 2, 6);
3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3363297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3393297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
340cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() != 0) {
341428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request:\n";
342428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
343cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mRecordingRequest.dump(fd, 2, 6);
344428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    } else {
345428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request: undefined\n";
346428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
347428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    }
348428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
351c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
352c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
3533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
354611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
364611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
36561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
36661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
36861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
370a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
372ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3733a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
375ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
376f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
37836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
3796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
380d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
382d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
383d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
384d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->deleteStream();
386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
387898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
388898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
389898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
390898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
391898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
392d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor->deleteStream();
393228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
3943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
3978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
39861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
39961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
40061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
40161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
402a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4039e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
404ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
405ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4148ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
416a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedCameraClient = client;
4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::STOPPED;
420228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
4219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
42261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
425a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4269e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
427ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
430ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
44361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
44561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
446a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4479e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
448ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
451ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
457a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedCameraClient.clear();
4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
46461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
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 (surface != 0) {
4776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
48136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
48261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
486a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4879e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
488ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
491ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
4966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
4976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
49836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
50136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
503a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5079e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5089e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
5219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
530cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
535d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
537be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
538be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
551bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
552be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
553bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
55961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
562a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
563228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
564ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
566228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
567228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
571228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
572228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
575228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
576228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
59861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
59961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
601a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6029e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
603ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
608d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
609ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
611d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
6126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state >= Parameters::PREVIEW && !restart) {
6144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
6174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
620be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
626228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updatePreviewStream(params);
627be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
632228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
634228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
635d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
638228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
642da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (params.zslMode) {
643da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mZslProcessor->updateStream(params);
644da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
645da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
646da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
647da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
648da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
649da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
6506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
651cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
652228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updatePreviewRequest(params);
653be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
655be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
656be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
6586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
660da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Vector<uint8_t> outputStreams;
661da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    outputStreams.push(getPreviewStreamId());
662da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
663228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
664da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(getCallbackStreamId());
665228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
666da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (params.zslMode) {
667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(getZslStreamId());
668da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
669da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
670da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mPreviewRequest.update(
671da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ANDROID_REQUEST_OUTPUT_STREAMS,
672da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams);
673da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
6766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
678be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
679cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mPreviewRequest.sort();
680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
6876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
688bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
689bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
6946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
69661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
69761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
69861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
699a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7009e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
701ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7023a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
70436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
705ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
706ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
70736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
708ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
713228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
714228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
715228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
717d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
718d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
719d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
721d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
723d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
724d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
725d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
727228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break - identical to preview
7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
729cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
7302267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
731228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
736d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
737228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
738d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
739d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
740228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
741d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
74261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
74361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
74461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
745a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
746ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7473a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
75261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
75361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
75461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
755a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
756ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
76478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
76778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
76878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
76978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
77078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
77178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
77278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
77478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
77578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
77661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
77761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
77861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
779a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7809e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
781ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7833a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
785228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
787228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
7883a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
789228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
790228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
791228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
793228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
7949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
7959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
7979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
7989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
802228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
8049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
8099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
8109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
812228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
81378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
81478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
81578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
81678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
81778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
81878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updateRecordingStream(params);
8209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
8229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
825228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
827228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
828d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
829228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
830228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
831228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
832228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
833228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
836cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
837228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRecordingRequest(params);
8389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
8399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
8409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
8419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
8429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
8439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
846da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint8_t outputStreams[3] ={
847da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId(),
848da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId(),
849da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCallbackStreamId()
850da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        };
851cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
852228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
853228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 3);
854228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
855da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint8_t outputStreams[2] = {
856da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId(),
857da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId()
858da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        };
859cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
860228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
861228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
862228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
8659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
868cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mRecordingRequest.sort();
8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
8719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
8799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
8809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
884228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
88761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
88861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
88961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
890a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8919e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
892ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
894228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8963a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
8973a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
9019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
9052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
9079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
9109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
9119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
9129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
9149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
9159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
9169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
9179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
9189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
9199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
9239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::PREVIEW;
92661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
92761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
92861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
929a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
930ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9318da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9323a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
9333a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9348da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9358da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9368da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9378da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9388da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9408da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
94361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
94461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
946a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
947ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
95030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
95230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
9549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
9559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
9569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
9579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
9589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
9599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
9609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
9619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
96378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
96478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
96578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
96678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
96778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
96878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
96978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
97030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
97130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    // Release the buffer back to the recording queue
97230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
97330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
97430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
97530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    size_t itemIndex;
97630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
97730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
97830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
97930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                item.mGraphicBuffer->handle == imgHandle) {
98030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            break;
98130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        }
98230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
98330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    if (itemIndex == mRecordingBuffers.size()) {
98430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
98530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
98630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        return;
98730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
98830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
98978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
99030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            imgHandle);
99130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
99230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
99378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
99478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
99578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
99630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
99778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
99878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
99930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    mRecordingBuffers.replaceAt(itemIndex);
100078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
10019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
100261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
100361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
100461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
1005a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1006ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10073a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1010174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1011174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1015174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1016174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1017174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1018174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
102061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
102161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
102261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1023a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1024ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10253a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10273a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1028174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1029174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
10302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
1032174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1033174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1034174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1035174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
103761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
103861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
103961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
1040a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1041ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1042d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
10433a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1044d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
10462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1050d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1051d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1052d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
1054d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
1055da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            res = commandStopFaceDetectionL(l.mParameters);
1056da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (res != OK) {
1057da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1058da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1059da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                return res;
1060da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
1061da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            l.mParameters.state = Parameters::STILL_CAPTURE;
1062da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
1063da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::RECORD:
1064da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            // Good to go for video snapshot
1065da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1066d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1069d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
1070d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1071d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1072d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1073d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1075d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1076da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mJpegProcessor->updateStream(l.mParameters);
1077228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1078228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1079228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1080228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return res;
1081228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1083da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureSequencer->startCapture();
1084d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1085da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1086d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1087d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1088d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1089da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
109061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
109161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
109261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1093a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
10949e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1095ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
10973a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10983a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
11022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
11039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
110761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
110961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1110a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1111ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1113ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1115ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
11172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.paramsFlattened;
111861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
111961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
112061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1121a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1122ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11243a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1125c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1126c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1127c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1128c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
112936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
113036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
113136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
113236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
113336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
113436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
113536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
113636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
113736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
113836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
113936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
114036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
114136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1142228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
11442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1145228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
114636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
114736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
114836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
114936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
115036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
115136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
115236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
115336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
115436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1155c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
115636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
115736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
115836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
115936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
116036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
116136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
116236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
116336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
116436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
116536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
116636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
116736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
116836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
116936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
117136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
117236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
117336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
117436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
117536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
117636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
117936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mPreviewStreamId != NO_STREAM) {
118036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mDevice->setStreamTransform(mPreviewStreamId, transform);
118136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
11822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
118336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
118436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
118536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
118636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
11872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
118836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1190c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
119136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1192983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
119336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
119436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
119536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
119636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
119736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
119836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
120036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
120136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
120336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1204983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
120536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1206983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1210983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
121336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
121536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
12178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
12188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
12268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
12278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
12288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
12292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
12302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
12328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
12338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
12348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_STATS_FACE_DETECTION_OFF) {
12388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
12398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
12408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
12418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
12438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
12458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
12478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
124936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
125036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1251228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
12528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
12538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
12548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1256228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
12578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1258228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
12598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
12612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1263228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
12648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
126736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
126836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
126936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1272174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
127336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
127436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
127536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
127636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
127736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
12782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1280983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
128136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
128236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
128336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
128436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
128536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
128636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
12878da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
128836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
128936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
129036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1291c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1292c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
129336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // 32 is the current upper limit on the video buffer count for BufferQueue
129436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (count > 32) {
129536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
129636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, count);
129736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
129836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
129936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
130036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Need to reallocate memory for heap
130136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mRecordingHeapCount != count) {
130236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if  (mRecordingHeap != 0) {
130336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap.clear();
130436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap = NULL;
130536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        }
130636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mRecordingHeapCount = count;
130736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1308c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
13096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
131061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
131161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
13133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1314160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1315160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1316160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1317160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1318160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1319160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1320160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1321160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1322160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1323160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1324160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1325160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1326174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1327174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1328174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1329174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1330174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1331174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1334174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1335174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1336174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1337174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1338174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1342174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1343174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1344174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1345174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1347174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1348174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1349174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1350174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1351174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1352174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1353174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1354174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1355174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1356174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1357174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1358174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1359174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1360174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1361174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1362174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1363174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1364174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1365174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1366174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1367174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1368174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1369174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1370174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1372174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
13732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1374174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1375174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
13802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1384174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1389174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1390174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1391174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
13972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1398174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
14022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1409a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1410a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1411a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1412a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1415174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1417a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1418a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1419a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
14208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
14218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1422174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1423603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1424a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1425a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1426a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1427a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
14288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1429603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1430160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1431160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1432160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1433160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1434160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1436160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1437160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1438160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1439160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1440160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1441160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1442160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCameraId() const {
1444a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mCameraId;
1445c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1446c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1447a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaconst sp<Camera2Device>& Camera2Client::getCameraDevice() {
1448a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mDevice;
1449c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1450c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1451a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1452a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1453c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1454c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
1456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mPreviewStreamId;
1457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1462da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1465da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1466da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1467da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
1468da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mRecordingStreamId;
1469da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1470da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1471da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1472da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1473da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t id,
1476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
1477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mFrameProcessor->registerListener(id, listener);
1478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t id) {
1481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mFrameProcessor->removeListener(id);
1482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1484a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1485a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mCameraClient(client.mCameraClient),
1486a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedClient(client) {
1487a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.lock();
1488c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1489c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1490a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::~Lock() {
1491a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.unlock();
14928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
14938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1494ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville TalvalaCamera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1495ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mCameraClient(client) {
1496ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala}
1497ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
1498a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1499a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        const sp<ICameraClient>&client) {
1500a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1501a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient = client;
1502a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return *this;
1503a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}
15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1505a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalavoid Camera2Client::SharedCameraClient::clear() {
1506a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1507a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient.clear();
15088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1510da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestId;
1511da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst int32_t Camera2Client::kRecordRequestId;
1512da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst int32_t Camera2Client::kFirstCaptureRequestId;
1513da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
15149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
15159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
15169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1517228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> recordingHeap;
15189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
15199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
15209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
15229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
152330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        BufferItemConsumer::BufferItem imgBuffer;
152430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        res = mRecordingConsumer->acquireBuffer(&imgBuffer);
15259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
15269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
15279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
153030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        timestamp = imgBuffer.mTimestamp;
15319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1532228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount++;
1533228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1534228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1535228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.state != Parameters::RECORD &&
15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1538228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1539228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "recording done",
1540228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
154130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
15429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1544898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
154578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
154678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
15479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
15489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
1549983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                    mRecordingHeapCount, bufferSize);
15509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1551983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
15529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
15539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
15549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
15559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
155630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingConsumer->releaseBuffer(imgBuffer);
15579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
15589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
155930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
156030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                if (mRecordingBuffers[i].mBuf !=
156130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                        BufferItemConsumer::INVALID_BUFFER_SLOT) {
156230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    ALOGE("%s: Camera %d: Non-empty recording buffers list!",
156330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                            __FUNCTION__, mCameraId);
156430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
156530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
156630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.clear();
156730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.setCapacity(mRecordingHeapCount);
156830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.insertAt(0, mRecordingHeapCount);
156930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
15709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
1571983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeapFree = mRecordingHeapCount;
15729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
15739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
15759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
15769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
157730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
15789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
15819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
1582983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
15839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
15849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
15869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
15899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
15909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
15919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
15929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
15939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
159478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
159578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
159630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((uint32_t*)data) = type;
159730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
159878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
159930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
160030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
1601228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        recordingHeap = mRecordingHeap;
16029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
1603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside locked parameters to allow re-entrancy from notification
1605a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    SharedCameraClient::Lock l(mSharedCameraClient);
1606a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    if (l.mCameraClient != 0) {
1607a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        l.mCameraClient->dataCallbackTimestamp(timestamp,
16089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
1609228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                recordingHeap->mBuffers[heapIdx]);
1610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1611d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1612d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
16133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
16143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::updateRequests(const Parameters &params) {
16168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
16178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updatePreviewRequest(params);
16198ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
16218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRecordingRequest(params);
16258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16268ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
16278ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
16328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
16338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
16348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
16358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
16368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
16378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
16408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
16418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
16428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
16438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
16448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
16458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
16488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
16498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1650836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
1651be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
1652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
1653836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
1655be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
1656be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
1657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
1658be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
1659be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1660be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
1661be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1662be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1663be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1664836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
1665836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
16669e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
16679e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
1668836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
1669be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
1670be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1675be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
1676be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
1678be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
1679be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
1680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
1683be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1684be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
1687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
1688836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
1689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1690be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
1691be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1692be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1694be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1695be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1696be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1697be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1698c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
1699836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
1700c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
1701c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1702c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1703c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
1704c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1705c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
1707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
1708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1709836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
1710a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
17116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1712cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
17136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
17146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
17156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
17166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
17176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
17186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
17196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
17206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1722da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = params.updateRequest(&mPreviewRequest);
1723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
1725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
1726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
1727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1729be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1730da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1731da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &kPreviewRequestId, 1);
1732be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1733d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
1734d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1735d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1736836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
17379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
17389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1739cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
17409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
17419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
17429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
17439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
17449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
17459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
17469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
17479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1749da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = params.updateRequest(&mRecordingRequest);
17509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
17519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
17529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
17539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
17549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
17559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
17589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
17599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1760836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
17619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
17629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
1764228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1765228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // always acquire and free a buffer when the heap is full; otherwise the consumer
1766228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // will have buffers in flight we'll never clear out.
176730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingConsumer = new BufferItemConsumer(
176830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                GRALLOC_USAGE_HW_VIDEO_ENCODER,
176930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingHeapCount + 1,
177030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                true);
17719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
17729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
17739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
17749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
17759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
17769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
17799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
17809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
17819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
17829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
17839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
17849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
17859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
17869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
17879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1788836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
1789836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
17909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
17919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
17929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
17939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
17949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
17959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
17969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
17979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
17989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
17999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
1803228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount = 0;
18049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
1805836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
180678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
18079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
18089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
18099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
18109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
18119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
18159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
18169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1820228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1821228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1822228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1823228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1824228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1825228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1826228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1827228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1828f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1829228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1830228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1831228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1832228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1833228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1837228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1840228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1841228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1842228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1843228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
18448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
184561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1846