Camera2Client.cpp revision cf70d3469332445dc3ffd09729da3538612b1bb2
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();
159cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mCaptureSequencer->requestExit();
160cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mJpegProcessor->requestExit();
161cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mZslProcessor->requestExit();
162cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mCallbackProcessor->requestExit();
163cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala
164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
16561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
16661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
168611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
170611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
171611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
172611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
177836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1804ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
184836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
186836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
18711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
188836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
190836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
192836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
194836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
198836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
201836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
205836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
209836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
222836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
236836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
245836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
267836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
278836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
293836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
294836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
296836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
297836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
301836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
3027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
3067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
314836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
318836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
319836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3213297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
322836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3243297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
325836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3273297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
330ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
331da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
3343297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
3353297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
336cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() != 0) {
3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
3383297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
339cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mPreviewRequest.dump(fd, 2, 6);
3403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
3413297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
3423297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3443297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
345cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() != 0) {
346428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request:\n";
347428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
348cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        mRecordingRequest.dump(fd, 2, 6);
349428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    } else {
350428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        result = "    Recording request: undefined\n";
351428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala        write(fd, result.string(), result.size());
352428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala    }
353428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
354da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
356c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
357c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
3583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
359611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
3607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
3623297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
3633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
3643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
3653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
3663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
3677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
369611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
37061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
37161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
37261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
37361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
37461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
375a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3769e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
377ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
3793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
380ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
38336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
3846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
385d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
387d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
388d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
389d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->deleteStream();
391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
392898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
393898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
394898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
395898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
396898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
397d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor->deleteStream();
398228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
399cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala    mZslProcessor->deleteStream();
400cf70d3469332445dc3ffd09729da3538612b1bb2Eino-Ville Talvala
4013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
4048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
40561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
40661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
40761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
40861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
409a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4109e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
411ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
412ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4218ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
4229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
423a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedCameraClient = client;
4249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::STOPPED;
427228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
4289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
42961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
43161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
432a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4339e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
434ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
437ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
45061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
45161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
45261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
453a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4549e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
455ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
458ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
464a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedCameraClient.clear();
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
47161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
47261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
475a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4769e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
477ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
480ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
48836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
48961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
493a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4949e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
495ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
4963a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
4973a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
498ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
5016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
5026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
5036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
5046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
50536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
50836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
509be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
510a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5149e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5159e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
5289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
5359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
5369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
537cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
542d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
547be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
5506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
552be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
5546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
5566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
558bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
559be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
560bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
56661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
569a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
570228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
571ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5723a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
573228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
574228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
577228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
578228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
579228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
580228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
581228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
593228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
602228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
60561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
608a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6099e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
610ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6113a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6123a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
615d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
616ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
618d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
6196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state >= Parameters::PREVIEW && !restart) {
6214ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
6244ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6254ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
627be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updatePreviewStream(params);
634be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
635be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
636be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
637be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
639228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
640228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
641228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
642d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
643228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
644228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
645228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
646228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
647228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
648228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
649da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (params.zslMode) {
650da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mZslProcessor->updateStream(params);
651da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
652da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
653da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
654da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
655da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
656da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
6576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
658cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
659228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updatePreviewRequest(params);
660be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
661be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
662be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
663be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
664be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
6656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Vector<uint8_t> outputStreams;
668da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    outputStreams.push(getPreviewStreamId());
669da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
670228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
671da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(getCallbackStreamId());
672228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
673da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (params.zslMode) {
674da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(getZslStreamId());
675da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
676da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
677da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mPreviewRequest.update(
678da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ANDROID_REQUEST_OUTPUT_STREAMS,
679da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams);
680da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
6816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
6826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
684be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
686cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mPreviewRequest.sort();
687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
688be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
6936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
6946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
695bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
696bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
6976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
6996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
7016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
70361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
70461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
70561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
706a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7079e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
708ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7103a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
71136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
712ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
713ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
71436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
715ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
717228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
720228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
721228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
722228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
724d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
725d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
726d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
728d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
730d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
731d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
732d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
734228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break - identical to preview
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
736cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala            mDevice->clearStreamingRequest();
7372267106c98f461b730c772a913da946c391a178cEino-Ville Talvala            mDevice->waitUntilDrained();
738228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
743d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
744228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
745d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
746d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
747228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
748d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
74961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
75061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
75161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
752a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
753ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7553a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
7563a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
75961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
76061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
76161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
762a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
763ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7663a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
77178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
77478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
77578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
77678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
77778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
77878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
77978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
78178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
78278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
78361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
78461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
78561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
786a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7879e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
788ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
7903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
792228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
794228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
7953a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
796228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
797228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
798228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
8019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
8029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
8049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
808228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
809228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
810228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
8119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
8169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
8179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
819228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
82078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
82178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
82278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
82378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
82478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
82578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
826609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
827609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
828228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    res = updateRecordingStream(params);
8299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
8319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
837d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
840228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
841228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
842228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
843228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
845cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
846228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRecordingRequest(params);
8479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
8489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
8499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
8509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
8519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
8529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
854228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
855da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint8_t outputStreams[3] ={
856da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId(),
857da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId(),
858da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCallbackStreamId()
859da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        };
860cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
861228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
862228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 3);
863228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    } else {
864da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        uint8_t outputStreams[2] = {
865da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId(),
866da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId()
867da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        };
868cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala        res = mRecordingRequest.update(
869228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
870228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                outputStreams, 2);
871228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
8749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
877cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    res = mRecordingRequest.sort();
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
8809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
8859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
8909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
893228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
8949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
8959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
89661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
89761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
89861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
899a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9009e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
901ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
903228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
9049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
9053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
9063a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
9109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
9159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
9169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
9172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
9199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
9209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
9219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
922609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
923609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
9249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
9269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
9279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
9299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
9309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
9349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
9359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::PREVIEW;
93761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
93861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
93961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
940a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
941ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9428da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9433a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
9443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9458da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9468da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9478da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9488da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9498da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9518da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
95461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
95561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
95661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
957a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
958ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
9593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
96130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
96330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
9649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
9659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
9669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
9679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
9689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
9699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
9709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
9719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
9729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
9739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
97478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint8_t *data = (uint8_t*)heap->getBase() + offset;
97578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    uint32_t type = *(uint32_t*)data;
97678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (type != kMetadataBufferTypeGrallocSource) {
97778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording frame type invalid (got %x, expected %x)",
97878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                __FUNCTION__, mCameraId, type, kMetadataBufferTypeGrallocSource);
97978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
98078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
98130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
98230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    // Release the buffer back to the recording queue
98330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
98430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    buffer_handle_t imgHandle = *(buffer_handle_t*)(data + 4);
98530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
98630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    size_t itemIndex;
98730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) {
98830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        const BufferItemConsumer::BufferItem item = mRecordingBuffers[itemIndex];
98930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&
99030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                item.mGraphicBuffer->handle == imgHandle) {
99130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            break;
99230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        }
99330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
99430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    if (itemIndex == mRecordingBuffers.size()) {
99530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find buffer_handle_t %p in list of "
99630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                "outstanding buffers", __FUNCTION__, mCameraId, imgHandle);
99730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        return;
99830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    }
99930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
100078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    ALOGV("%s: Camera %d: Freeing buffer_handle_t %p", __FUNCTION__, mCameraId,
100130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            imgHandle);
100230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
100330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);
100478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    if (res != OK) {
100578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to free recording frame (buffer_handle_t: %p):"
100678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "%s (%d)",
100730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgHandle, strerror(-res), res);
100878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return;
100978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
101030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala    mRecordingBuffers.replaceAt(itemIndex);
101178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
10129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
101361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
101461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
101561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
1016a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1017ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10193a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10203a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1021174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1022174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1026174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1027174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1028174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1029174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
103161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
103261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
103361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1034a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1035ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
10363a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1039174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1040174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
10412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
1043174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1044174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1045174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1046174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
104861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
104961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
105061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
1051a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1052ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1053d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
10543a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1055d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
10572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1061d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1062d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1063d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
1065d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
1066da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            res = commandStopFaceDetectionL(l.mParameters);
1067da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (res != OK) {
1068da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1069da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1070da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                return res;
1071da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
1072da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            l.mParameters.state = Parameters::STILL_CAPTURE;
1073da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
1074da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::RECORD:
1075da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            // Good to go for video snapshot
1076da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1077d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1080d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
1081d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1082d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
1083d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1084d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
10858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1086d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1087da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mJpegProcessor->updateStream(l.mParameters);
1088228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (res != OK) {
1089228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1090228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1091228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        return res;
1092228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
10938ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1094da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureSequencer->startCapture();
1095d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1096da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1097d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1098d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1099d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
110161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
110261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
110361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1104a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11059e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
1106ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
11083a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11093a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
11132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
11149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11178ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
111861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
112061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1121a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1122ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11233a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1124ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1126ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
11282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.paramsFlattened;
112961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
113061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
113161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1132a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1133ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11343a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
11353a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1136c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1137c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1138c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1139c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
114036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
114136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
114236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
114336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
114436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
114536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
114636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
114736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
114836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
114936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
115036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
115136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
115236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1153228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
11542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
11552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1156228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
115736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
115836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
115936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
116036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
116136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
116236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
116336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
116436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
116536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1166c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
116736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
116836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
116936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
117036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
117136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
117236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
117336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
117436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
117536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
117636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
117736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
117836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
117936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
118036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
118236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
118336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
118436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
118536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
118636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
118736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
11882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
119036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mPreviewStreamId != NO_STREAM) {
119136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mDevice->setStreamTransform(mPreviewStreamId, transform);
119236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
119436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
119536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
119636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
119736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
11982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
119936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1201c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
120236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1203983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
120436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
120536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
120636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
121336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1215983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1217983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
12182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
121936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
122036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1221983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
122236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartFaceDetectionL(int type) {
12288ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
12298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
12342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
12352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
12378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
12388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
12398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
12412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
12438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
12448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
12458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_STATS_FACE_DETECTION_OFF) {
12498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
12508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
12518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return INVALID_OPERATION;
12528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
12548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
12568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
12588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
126036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
126136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1262228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
12638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
12648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
12658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1267228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
12688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1269228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
12708ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1274228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
12758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
12768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
12778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
127836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
127936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
128036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1283174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
128436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
128536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
128636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
128736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
128836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1291983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
129236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
129336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
129436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
129536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
129636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
129736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
12988da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
129936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
130036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
130136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1302c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1303c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
130436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // 32 is the current upper limit on the video buffer count for BufferQueue
130536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (count > 32) {
130636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as video buffer count value",
130736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, count);
130836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
130936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
131036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
131136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Need to reallocate memory for heap
131236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (mRecordingHeapCount != count) {
131336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if  (mRecordingHeap != 0) {
131436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap.clear();
131536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mRecordingHeap = NULL;
131636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        }
131736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        mRecordingHeapCount = count;
131836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1319c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
13206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
132161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
132261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
13243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1325160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyError(int errorCode, int arg1, int arg2) {
1326160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGE("Error condition %d reported by HAL, arguments %d, %d", errorCode, arg1, arg2);
1327160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1328160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1329160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyShutter(int frameNumber, nsecs_t timestamp) {
1330160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Shutter notification for frame %d at time %lld", __FUNCTION__,
1331160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            frameNumber, timestamp);
1332160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1333160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1334160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1335160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1336160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1337174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1338174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1339174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1342174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1345174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1346174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1347174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1348174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1349174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
13502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1351174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1352174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1353174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1354174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1355174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1356174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1358174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1359174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1360174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1361174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1362174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1363174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1364174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1365174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1366174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1367174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1368174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1369174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1370174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1372174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1373174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1374174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1375174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1376174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1383174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
13842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1385174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
13882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1389174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1390174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
13912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
13972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
13982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1410174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
14132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1415174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1420a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1421a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1422a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1423a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1424174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1425174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1427174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1428a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1429a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1430a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
14318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
14328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1433174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1434603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1435a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        SharedCameraClient::Lock l(mSharedCameraClient);
1436a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        if (l.mCameraClient != 0) {
1437a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala            l.mCameraClient->notifyCallback(CAMERA_MSG_FOCUS,
1438a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
14398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1440603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1441160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1442160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1443160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1444160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1445160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1446da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1447160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1448160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1449160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoWhitebalance(uint8_t newState, int triggerId) {
1450160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Auto-whitebalance state now %d, last trigger %d",
1451160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1452160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1453160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCameraId() const {
1455a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mCameraId;
1456c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1457c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1458a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalaconst sp<Camera2Device>& Camera2Client::getCameraDevice() {
1459a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mDevice;
1460c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1461c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1462609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvalaconst sp<CameraService>& Camera2Client::getCameraService() {
1463609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    return mCameraService;
1464609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala}
1465609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
1466a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1467a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1468c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1469c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1470da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
1471da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mPreviewStreamId;
1472da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1473da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
1483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mRecordingStreamId;
1484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1487da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t id,
1491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
1492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mFrameProcessor->registerListener(id, listener);
1493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1494da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1495da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t id) {
1496da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mFrameProcessor->removeListener(id);
1497da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1498da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1499a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::Lock(SharedCameraClient &client):
1500a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mCameraClient(client.mCameraClient),
1501a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        mSharedClient(client) {
1502a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.lock();
1503c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1504c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1505a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient::Lock::~Lock() {
1506a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mSharedClient.mCameraClientLock.unlock();
15078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15088ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1509ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville TalvalaCamera2Client::SharedCameraClient::SharedCameraClient(const sp<ICameraClient>&client):
1510ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala        mCameraClient(client) {
1511ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala}
1512ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
1513a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville TalvalaCamera2Client::SharedCameraClient& Camera2Client::SharedCameraClient::operator=(
1514a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        const sp<ICameraClient>&client) {
1515a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1516a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient = client;
1517a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return *this;
1518a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala}
15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1520a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalavoid Camera2Client::SharedCameraClient::clear() {
1521a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    Mutex::Autolock l(mCameraClientLock);
1522a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    mCameraClient.clear();
15238ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1525da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestId;
1526da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst int32_t Camera2Client::kRecordRequestId;
1527da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst int32_t Camera2Client::kFirstCaptureRequestId;
1528da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
15299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
15309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
15319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1532228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    sp<Camera2Heap> recordingHeap;
15339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
15349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
15359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
15379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
153830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        BufferItemConsumer::BufferItem imgBuffer;
153930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        res = mRecordingConsumer->acquireBuffer(&imgBuffer);
15409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
15419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
15429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
154530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        timestamp = imgBuffer.mTimestamp;
15469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1547228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount++;
1548228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("OnRecordingFrame: Frame %d", mRecordingFrameCount);
1549228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1550228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // TODO: Signal errors here upstream
15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (l.mParameters.state != Parameters::RECORD &&
15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.state != Parameters::VIDEO_SNAPSHOT) {
1553228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1554228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    "recording done",
1555228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
155630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
15579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1559898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
156078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        if (mRecordingHeap == 0) {
156178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            const size_t bufferSize = 4 + sizeof(buffer_handle_t);
15629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
15639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
1564983cf231ab2d176a14595cdae46ff1b0c239af47James Dong                    mRecordingHeapCount, bufferSize);
15659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1566983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeap = new Camera2Heap(bufferSize, mRecordingHeapCount,
15679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
15689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
15699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
15709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
157130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingConsumer->releaseBuffer(imgBuffer);
15729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
15739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
157430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            for (size_t i = 0; i < mRecordingBuffers.size(); i++) {
157530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                if (mRecordingBuffers[i].mBuf !=
157630e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                        BufferItemConsumer::INVALID_BUFFER_SLOT) {
157730e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                    ALOGE("%s: Camera %d: Non-empty recording buffers list!",
157830e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                            __FUNCTION__, mCameraId);
157930e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                }
158030e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            }
158130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.clear();
158230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.setCapacity(mRecordingHeapCount);
158330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingBuffers.insertAt(0, mRecordingHeapCount);
158430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
15859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
1586983cf231ab2d176a14595cdae46ff1b0c239af47James Dong            mRecordingHeapFree = mRecordingHeapCount;
15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
15889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
15909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
15919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
159230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala            mRecordingConsumer->releaseBuffer(imgBuffer);
15939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
15969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
1597983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        mRecordingHeapHead = (mRecordingHeapHead + 1) % mRecordingHeapCount;
15989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
15999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
16019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
16029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
16039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
16049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
16059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
16069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
16079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
16089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
160978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint8_t *data = (uint8_t*)heap->getBase() + offset;
161078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        uint32_t type = kMetadataBufferTypeGrallocSource;
161130e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((uint32_t*)data) = type;
161230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        *((buffer_handle_t*)(data + 4)) = imgBuffer.mGraphicBuffer->handle;
161378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGV("%s: Camera %d: Sending out buffer_handle_t %p",
161430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                __FUNCTION__, mCameraId, imgBuffer.mGraphicBuffer->handle);
161530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingBuffers.replaceAt(imgBuffer, heapIdx);
1616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        recordingHeap = mRecordingHeap;
16179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
1618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
1619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    // Call outside locked parameters to allow re-entrancy from notification
1620a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    SharedCameraClient::Lock l(mSharedCameraClient);
1621a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    if (l.mCameraClient != 0) {
1622a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala        l.mCameraClient->dataCallbackTimestamp(timestamp,
16239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
1624228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                recordingHeap->mBuffers[heapIdx]);
1625d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1626d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1627d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
16283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
16293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvalastatus_t Camera2Client::updateRequests(const Parameters &params) {
16318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
16328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updatePreviewRequest(params);
16348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16358ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
16368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16378ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    res = updateRecordingRequest(params);
16408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
16418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
16428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
16438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
16448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
16478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
16488ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
16498ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
16508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
16518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
16528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
16558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
16568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
16578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
16588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
16598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
16608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
16618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
16638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
16648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1665836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream(const Parameters &params) {
1666be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
1667be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
1668836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1669be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
1670be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
1671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
1672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
1673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
1674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1675be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
1676be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1678be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1679836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.previewWidth ||
1680836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.previewHeight) {
16819e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
16829e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
1683836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                    params.previewWidth, params.previewHeight);
1684be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
1685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
1687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1688be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1690be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
1691be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
1692be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
1693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
1694be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
1695be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
1696be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
1697be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
1698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1699be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1700be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
1702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
1703836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.previewWidth, params.previewHeight,
1704be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
1705be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
1706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
1708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1711be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1713c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
1714836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            params.previewTransform);
1715c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
1716c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
1717c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
1718c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
1719c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1720c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
1722be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
1723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1724836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest(const Parameters &params) {
1725a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
17266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
1727cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mPreviewRequest.entryCount() == 0) {
17286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
17296db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
17306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
17316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
17326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
17336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
17346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
17356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
1736be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1737da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = params.updateRequest(&mPreviewRequest);
1738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
1740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
1741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
1742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1745da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mPreviewRequest.update(ANDROID_REQUEST_ID,
1746da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &kPreviewRequestId, 1);
1747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1748d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
1749d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1750d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1751836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest(const Parameters &params) {
17529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
17539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
1754cab96a4a7a2900fa991ab77ae45ba8d4be97e054Eino-Ville Talvala    if (mRecordingRequest.entryCount() == 0) {
17559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
17569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
17579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
17589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
17599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
17609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
17619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
17629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1764da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = params.updateRequest(&mRecordingRequest);
17659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
17669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
17679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
17689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
17699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
17709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
17739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
17749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1775836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream(const Parameters &params) {
17769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
17779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
1779228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // Create CPU buffer queue endpoint. We need one more buffer here so that we can
1780228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // always acquire and free a buffer when the heap is full; otherwise the consumer
1781228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        // will have buffers in flight we'll never clear out.
178230e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala        mRecordingConsumer = new BufferItemConsumer(
178330e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                GRALLOC_USAGE_HW_VIDEO_ENCODER,
178430e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                mRecordingHeapCount + 1,
178530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala                true);
17869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
17879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
17889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
17899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
17909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
17919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
17929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
17939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
17949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
17959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
17969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
17979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
17989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
17999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
18009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
18019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
18029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1803836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala        if (currentWidth != (uint32_t)params.videoWidth ||
1804836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                currentHeight != (uint32_t)params.videoHeight) {
18059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
18069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
18079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
18089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
18099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
18109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
18119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
18129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
18139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
18149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
1818228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        mRecordingFrameCount = 0;
18199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
1820836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                params.videoWidth, params.videoHeight,
182178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0, &mRecordingStreamId);
18229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
18239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
18249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
18259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
18269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
18279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
18289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
18299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
18309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
18319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1832228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1833228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1834228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1835228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1836228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1837228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1838228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1839228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1840228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1841228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1842228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1843f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1844228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1845228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1846228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1847228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1848228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1849228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1850228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1851228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1852228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1853228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1854228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1855228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1856228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1857228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1858228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
18598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
186061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1861