Camera2Client.cpp revision a9c64a9398ac2e6173f99e252f305808a34cab1c
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
17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define LOG_TAG "Camera2"
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/Surface.h>
26c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "camera2/Parameters.h"
27fe140e882c578883238a2dd7793159c848a07b49James Painter#include "Camera2Client.h"
287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "Camera2Device.h"
297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "Camera3Device.h"
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "camera2/ZslProcessor.h"
322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "camera2/ZslProcessor3.h"
332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2;
392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
4848af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala        const String16& clientPackageName,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
518dcdb9553defafa1166c64b496e1ee390e4eadfaIgor Murashkin        int clientPid,
5248af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala        uid_t clientUid,
537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        int servicePid,
547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        int deviceVersion):
55a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
5648af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala                cameraId, cameraFacing, clientPid, clientUid, servicePid),
572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        mParameters(cameraId, cameraFacing),
582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        mDeviceVersion(deviceVersion)
59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
60a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGI("Camera %d: Opened", cameraId);
6261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
632fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    switch (mDeviceVersion) {
647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        case CAMERA_DEVICE_API_VERSION_2_0:
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            mDevice = new Camera2Device(cameraId);
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            break;
677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        case CAMERA_DEVICE_API_VERSION_3_0:
687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            mDevice = new Camera3Device(cameraId);
697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            break;
707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        default:
717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            ALOGE("Camera %d: Unknown HAL device version %d",
722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    cameraId, mDeviceVersion);
737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            mDevice = NULL;
747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            break;
757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    }
767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
77228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
84a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
85c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
889ab909bff49b2eccde1b028901717c193ef723afIgor Murashkin    res = Camera2ClientBase::initialize(module);
8948af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala    if (res != OK) {
9048af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala        return res;
9148af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala    }
9248af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala
932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.initialize(&(mDevice->info()));
96f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
97f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
98f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    String8 threadName;
10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
10443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    mStreamingProcessor = new StreamingProcessor(this);
105254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    threadName = String8::format("C2-%d-StreamProc",
106254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala            mCameraId);
107254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->run(threadName.string());
10843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala
10971381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    mFrameProcessor = new FrameProcessor(mDevice, this);
110852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    threadName = String8::format("C2-%d-FrameProc",
11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mCameraId);
11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
115852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    threadName = String8::format("C2-%d-CaptureSeq",
11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mCameraId);
11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
120852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    threadName = String8::format("C2-%d-JpegProc",
121177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala            mCameraId);
12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
123177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala
1242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    switch (mDeviceVersion) {
1252fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case CAMERA_DEVICE_API_VERSION_2_0: {
1262fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<ZslProcessor> zslProc =
1272fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    new ZslProcessor(this, mCaptureSequencer);
1282fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            mZslProcessor = zslProc;
1292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            mZslProcessorThread = zslProc;
1302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
1312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
1322fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        case CAMERA_DEVICE_API_VERSION_3_0:{
1332fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<ZslProcessor3> zslProc =
1342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                    new ZslProcessor3(this, mCaptureSequencer);
1352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            mZslProcessor = zslProc;
1362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            mZslProcessorThread = zslProc;
1372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
1382fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        }
1392fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        default:
1402fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            break;
1412fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    }
142852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    threadName = String8::format("C2-%d-ZslProc",
14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mCameraId);
1442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    mZslProcessorThread->run(threadName.string());
145177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala
1462863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
147852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala    threadName = String8::format("C2-%d-CallbkProc",
14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mCameraId);
14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
1502863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala
151f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
153f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
155f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
156f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
157f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
15861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
15961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
16061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
161a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
16202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala    ALOGV("~Camera2Client");
1634ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
166617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala    disconnect();
167c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
16961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
17061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
17161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
172611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1737d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n",
174611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
175a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            getRemoteCallback()->asBinder().get(),
1767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala            String8(mClientPackageName).string(),
177611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1854ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
189836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
19211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
193836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
195836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
197836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
199836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
200836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
202836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
203836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
205836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
206836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
208836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
210836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
214836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
2152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
2162d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
2172d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
2182d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
2192d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
2202d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
2212d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
2222d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
227836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
2282d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
2292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
2302d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
2312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
2322d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
2332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
2342d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
2352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
2362d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
241836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
2422d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
2432d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
2442d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
2452d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
250836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
272836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
283836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
295f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala    result.append("   Focus state: ");
296f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala    switch (p.focusState) {
297f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
298f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
299f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
300f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
301f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
302f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
303f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        default: result.append("UNKNOWN\n");
304f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala    }
305f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala
3067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
3087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
309836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
310836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
3147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
317836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
3187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
320836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
321836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
3227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
324836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
326836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
327836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
328836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
329836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
330836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
333836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
334836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
335836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3373297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
338836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3403297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
341836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3433297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            getPreviewStreamId());
346177bd3489e73ed86cf47c485c88292bf399bd48aEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            getCaptureStreamId());
34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            getRecordingStreamId());
350596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala
351596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    result.append("  Quirks for this camera:\n");
352596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    bool haveQuirk = false;
353596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    if (p.quirks.triggerAfWithAuto) {
354596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala        result.appendFormat("    triggerAfWithAuto\n");
355596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala        haveQuirk = true;
356596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    }
357596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    if (p.quirks.useZslFormat) {
358596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala        result.appendFormat("    useZslFormat\n");
359596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala        haveQuirk = true;
360596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    }
3613a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    if (p.quirks.meteringCropRegion) {
3623a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        result.appendFormat("    meteringCropRegion\n");
3633a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        haveQuirk = true;
3643a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    }
365596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    if (!haveQuirk) {
366596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala        result.appendFormat("    none\n");
367596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    }
368596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala
36943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    write(fd, result.string(), result.size());
3703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
37143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    mStreamingProcessor->dump(fd, args);
372428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
375c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
376c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
3772274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala    mZslProcessor->dump(fd, args);
3782274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala
379a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    return dumpDevice(fd, args);
3807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
38161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
38461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
38561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
386a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
387a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
388617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala
389617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala    // Allow both client and the media server to disconnect at all times
390617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala    int callingPid = getCallingPid();
391617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala    if (callingPid != mClientPid && callingPid != mServicePid) return;
392ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3957adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
3967adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
39702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala    /**
39802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala     * disconnect() cannot call any methods that might need to promote a
39902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala     * wp<Camera2Client>, since disconnect can be called from the destructor, at
40002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala     * which point all such promotions will fail.
40102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala     */
40202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala
403e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    stopPreviewL();
4046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4057adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    {
4067adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
407617048834dc5b2cb87ab208bdd526262a7c4e90cEino-Ville Talvala        if (l.mParameters.state == Parameters::DISCONNECTED) return;
4087adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala        l.mParameters.state = Parameters::DISCONNECTED;
4097adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    }
4107adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
41143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    mStreamingProcessor->deletePreviewStream();
41243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    mStreamingProcessor->deleteRecordingStream();
41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mJpegProcessor->deleteStream();
4142863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala    mCallbackProcessor->deleteStream();
4157d8b92bf72194896363ceef97e12a52ac1bb1e5cEino-Ville Talvala    mZslProcessor->deleteStream();
4167d8b92bf72194896363ceef97e12a52ac1bb1e5cEino-Ville Talvala
417254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->requestExit();
4187adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mFrameProcessor->requestExit();
4197adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mCaptureSequencer->requestExit();
4207adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mJpegProcessor->requestExit();
4212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    mZslProcessorThread->requestExit();
4227adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mCallbackProcessor->requestExit();
4237adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
4247adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    ALOGV("Camera %d: Waiting for threads", mCameraId);
4257adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
426254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    mStreamingProcessor->join();
4277adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mFrameProcessor->join();
4287adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mCaptureSequencer->join();
4297adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mJpegProcessor->join();
4302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    mZslProcessorThread->join();
4317adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mCallbackProcessor->join();
4327adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
4337adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    ALOGV("Camera %d: Disconnecting device", mCameraId);
4347adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
4357adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala    mDevice->disconnect();
4367adb52f9fcbe9e72ac29f89bfdabea093a0a0804Eino-Ville Talvala
4373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
43961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
44261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
443a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
445a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
446ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
4489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
4499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
4509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
4519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
4558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
456a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    mRemoteCallback = client;
457a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    mSharedCameraCallbacks = client;
4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
46061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
46161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
46261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
463a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4649e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
465a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
468ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
4759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
4769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
4789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
48161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
48261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
48361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
484a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4859e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
486a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
4879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
4889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
489ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
491cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
492cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala        if (l.mParameters.state == Parameters::RECORD ||
493cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala                l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
494cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala            ALOGD("Not allowed to unlock camera during recording.");
495cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala            return INVALID_OPERATION;
496cfee40e0d30aa2d93df2c4633e7573165f0d7337Eino-Ville Talvala        }
4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
498a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        mRemoteCallback.clear();
499a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        mSharedCameraCallbacks.clear();
5009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
5019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
5039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
5049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
5059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
50661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
50761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
5096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
510a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
512a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
5133a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5143a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
515ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
5186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
519a6843669d4da47755ce97fb85389d4d1c52b8197Mathias Agopian        binder = surface->getIGraphicBufferProducer()->asBinder();
5206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
52336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder,window);
52461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
52561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
527484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
528a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
530a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
5313a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
5323a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
533ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
5356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
536484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden    if (bufferProducer != 0) {
537484566c410afdfbc4b6bc5aa1732aef37428a5b8Andy McFadden        binder = bufferProducer->asBinder();
538b1e7cd156ca3e1747374e0d20cdd1ce467210453Mathias Agopian        window = new Surface(bufferProducer);
5396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
54036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
54336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
545a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5509e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
554c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala    Parameters::State state;
555c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala    {
556c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
557c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala        state = l.mParameters.state;
558c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala    }
559c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala    switch (state) {
5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
566c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala                    Parameters::getStateName(state));
5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
57402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala            res = stopStream();
57502f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala            if (res != OK) {
57602f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala                ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
57702f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala                        __FUNCTION__, strerror(-res), res);
57802f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala                return res;
57902f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala            }
580c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
584bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
58543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    res = mStreamingProcessor->setPreviewWindow(window);
58643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    if (res != OK) {
58743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        ALOGE("%s: Unable to set new preview window: %s (%d)",
58843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                __FUNCTION__, strerror(-res), res);
58943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        return res;
59043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    }
591bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
592c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
593c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
594c0fdb98b87bdd88c643a630e18838ddcdd5ab964Eino-Ville Talvala        l.mParameters.state = state;
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
59961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
602a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
604a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
605ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin
606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
610228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
611228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
612228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
613228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
614228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
620228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        switch(params.state) {
6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
622228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
623228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
626228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startRecordingL(params, true);
627228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
628228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
629228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
630228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
631228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
632228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to refresh request in state %s",
6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
635228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
637228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
63861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
63961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
64061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
641a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6429e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
643a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
6443a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
6453a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
648d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
649ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
650228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
651d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
6526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
6530cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin
6540cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
6550cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin
656411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala    if ( (params.state == Parameters::PREVIEW ||
657411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala                    params.state == Parameters::RECORD ||
658411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala                    params.state == Parameters::VIDEO_SNAPSHOT)
659411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala            && !restart) {
660411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala        // Succeed attempt to re-enter a streaming state
661411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala        ALOGI("%s: Camera %d: Preview already active, ignoring restart",
662411ddcc42a17abf4173345a992e4cd6575751739Eino-Ville Talvala                __FUNCTION__, mCameraId);
66371d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray        return OK;
66471d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray    }
66571d6454cc20b7a3bbe0cfd375c778c5fcc54795aAlex Ray    if (params.state > Parameters::PREVIEW && !restart) {
6664ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
6694ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
6704ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
6716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
67243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    if (!mStreamingProcessor->haveValidPreviewWindow()) {
6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
6746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
6756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
6779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
67843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    res = mStreamingProcessor->updatePreviewStream(params);
679be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
6836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
68443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala
685a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // We could wait to create the JPEG output stream until first actual use
686a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // (first takePicture call). However, this would substantially increase the
687a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // first capture latency on HAL3 devices, and potentially on some HAL2
688a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // devices. So create it unconditionally at preview start. As a drawback,
689a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // this increases gralloc memory consumption for applications that don't
690a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // ever take a picture.
691a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // TODO: Find a better compromise, though this likely would involve HAL
692a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // changes.
693a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    res = updateProcessorStream(mJpegProcessor, params);
694a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    if (res != OK) {
695a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        ALOGE("%s: Camera %d: Can't pre-configure still image "
696a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                "stream: %s (%d)",
697a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
698a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala        return res;
699a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    }
700a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala
70143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    Vector<uint8_t> outputStreams;
702228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
703228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
704228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
7052863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
706228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
707228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
708228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
710228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
71143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        outputStreams.push(getCallbackStreamId());
712228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
713f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala    if (params.zslMode && !params.recordingHint) {
7145282713a976184e41451315f1286d8075b257d58Igor Murashkin        res = updateProcessorStream(mZslProcessor, params);
71569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
71669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
71769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
71869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return res;
71969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
72043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        outputStreams.push(getZslStreamId());
72169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
7226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
72343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    outputStreams.push(getPreviewStreamId());
72443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala
725f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala    if (!params.recordingHint) {
72643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        if (!restart) {
72743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            res = mStreamingProcessor->updatePreviewRequest(params);
728f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala            if (res != OK) {
72943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request: "
73043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
73143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                        strerror(-res), res);
732f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala                return res;
733f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala            }
734f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala        }
73543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
73643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                outputStreams);
737f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala    } else {
73843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        if (!restart) {
73943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            res = mStreamingProcessor->updateRecordingRequest(params);
74043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            if (res != OK) {
74143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request with "
74243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
74343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                        strerror(-res), res);
74443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                return res;
74543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            }
74643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        }
74743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
74843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                outputStreams);
749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
75143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
752be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
7546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
7576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
75861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
75961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
76061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
761a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7629e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
763a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
7643a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7653a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
76636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
767ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
768ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
76936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
770ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
7714c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    status_t res;
772e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
774228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
777228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
778228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
779228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
78148af7e8dd40883d6154e7029d9500072b551b5faEino-Ville Talvala            // Nothing to do.
782d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
784e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
786e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala            mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
787e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala            // no break
7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
79002f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala            res = stopStream();
79102f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala            if (res != OK) {
79202f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
79302f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
79402f8457cf788e09e4f0c302dda453f13293009e7Eino-Ville Talvala            }
7954c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala            res = mDevice->waitUntilDrained();
7964c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala            if (res != OK) {
7974c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
7984c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
7994c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala            }
800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
805d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
806228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
809228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
81161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
81261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
81361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
814a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
815a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
8163a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8173a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
8183a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
82161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
82261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
82361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
824a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
825a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
8263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8273a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
8283a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
83378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
83678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
83778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
83878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
83978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
84078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
84178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.storeMetadataInBuffers = enabled;
84378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
84478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
84561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
84661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
84761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
848a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8499e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
850a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
8519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
8523a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
854228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
856228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
8573a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
858228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
859228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
8600cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin
8610cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
8620cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin
863228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
865228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
8669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
8679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
8699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
8709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
8722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
873228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
874228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
875228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
8769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
8779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
8789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
8819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
8829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
8839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
884228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.storeMetadataInBuffers) {
88578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        ALOGE("%s: Camera %d: Recording only supported in metadata mode, but "
88678822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                "non-metadata recording mode requested!", __FUNCTION__,
88778822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala                mCameraId);
88878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
88978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
89078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
89143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    if (!restart) {
89243cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        mCameraService->playSound(CameraService::SOUND_RECORDING);
89343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        mStreamingProcessor->updateRecordingRequest(params);
89443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        if (res != OK) {
89543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
89643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
89743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            return res;
89843cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        }
89943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    }
90033578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala
90182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = updateProcessorStream<
90282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            StreamingProcessor,
90382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
90482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                                        params);
9059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
9069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
9079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
9089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
9099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
91043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala
91143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    Vector<uint8_t> outputStreams;
912228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    bool callbacksEnabled = params.previewCallbackFlags &
913228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK;
914228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
9152863918926c82d6002de160c9d499be9b6a3856eEino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
916228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
917228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
918228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
919228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
920228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
92143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        outputStreams.push(getCallbackStreamId());
922228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
92343cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    outputStreams.push(getPreviewStreamId());
92443cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    outputStreams.push(getRecordingStreamId());
9259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
92643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
92743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            outputStreams);
9289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
92943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
9309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
9319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
9329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
9339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
9352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
936228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
9379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
9389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
93961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
94061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
942a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9439e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
944a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
946228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
9479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
9483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
9493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
9539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
9562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
9572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
9589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
9599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
9629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
9639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
9649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
96533578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
96633578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala
967f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala    res = startPreviewL(l.mParameters, true);
9689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
969f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to return to preview",
970f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala                __FUNCTION__, mCameraId);
9719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
97261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
97361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
97461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
975a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
976a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9778da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
9793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9808da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
9818da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
9828da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9838da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
9848da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
9852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9868da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
9872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
98961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
99061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
99161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
992a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
993a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
99530e65e7e2ec01e13e45b5e38552a34d2fbb3f866Eino-Ville Talvala
99643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    mStreamingProcessor->releaseRecordingFrame(mem);
99761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
99861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
99961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
1000a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1001a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1002c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
10033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10053a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1006174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1007f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala    bool notifyImmediately = false;
1008f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala    bool notifySuccess = false;
1009174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10114c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        if (l.mParameters.state < Parameters::PREVIEW) {
10124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala            return INVALID_OPERATION;
10134c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        }
10144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
10155b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin        /**
10165b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin          * If the camera does not support auto-focus, it is a no-op and
10175b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin          * onAutoFocus(boolean, Camera) callback will be called immediately
10185b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin          * with a fake value of success set to true.
10199454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          *
10209454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * Similarly, if focus mode is set to INFINITY, there's no reason to
10219454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * bother the HAL.
10225b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin          */
10239454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
10249454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1025f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala            notifyImmediately = true;
1026f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala            notifySuccess = true;
1027f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        }
1028f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        /**
1029f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         * If we're in CAF mode, and AF has already been locked, just fire back
1030f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         * the callback right away; the HAL would not send a notification since
1031f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         * no state change would happen on a AF trigger.
1032f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         */
1033f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
1034f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
1035f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala                l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
1036f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala            notifyImmediately = true;
1037f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala            notifySuccess = true;
1038f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        }
1039f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        /**
1040f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         * Send immediate notification back to client
1041f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         */
1042f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        if (notifyImmediately) {
1043a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1044a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            if (l.mRemoteCallback != 0) {
1045a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin                l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1046f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala                        notifySuccess ? 1 : 0, 0);
10475b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin            }
10485b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin            return OK;
10495b44beef5a4ff04889bcdd874dc4e8d140f3edacIgor Murashkin        }
1050f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        /**
1051f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         * Handle quirk mode for AF in scene modes
1052f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala         */
10534c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala        if (l.mParameters.quirks.triggerAfWithAuto &&
10544c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED &&
105565dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
105665dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala                !l.mParameters.focusingAreas[0].isEmpty()) {
10574c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
10584c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala                    __FUNCTION__, l.mParameters.focusMode);
10594c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
10604c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
10614c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            updateRequests(l.mParameters);
10624c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala        }
10634c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala
10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1066174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
10674c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    syncWithDevice();
1068174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1069174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1070174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
10716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
107261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
107361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
107461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1075a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1076a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1077c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
10783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
10793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
10803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1081174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1082174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
10832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
10849454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        // Canceling does nothing in FIXED or INFINITY modes
10859454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
10869454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
10879454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala            return OK;
10889454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        }
10892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
10904c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala
10914c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala        // When using triggerAfWithAuto quirk, may need to reset focus mode to
109265dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala        // the real state at this point. No need to cancel explicitly if
109365dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala        // changing the AF mode.
10944c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
10954c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
10964c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala                    l.mParameters.shadowFocusMode);
10974c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
10984c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
10994c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala            updateRequests(l.mParameters);
110065dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala
110165dc3fc6fd708350c8d984736da5a2a0b72c5324Eino-Ville Talvala            return OK;
11024c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala        }
1103174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
11044c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    syncWithDevice();
1105174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1106174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1107174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
11086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
110961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
111061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
111172421521fd06787a407d06966e11f17b86900d2aBen Murdochstatus_t Camera2Client::takePicture(int msgType) {
1112a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1113a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
11153a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11171d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala    {
11181d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
11191d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala        switch (l.mParameters.state) {
11201d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            case Parameters::DISCONNECTED:
11211d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            case Parameters::STOPPED:
11221d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            case Parameters::WAITING_FOR_PREVIEW_WINDOW:
11231d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
112469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                        __FUNCTION__, mCameraId);
11251d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                return INVALID_OPERATION;
11261d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            case Parameters::PREVIEW:
11271d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                // Good to go for takePicture
11281d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                res = commandStopFaceDetectionL(l.mParameters);
11291d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                if (res != OK) {
11301d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                    ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
11311d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                            __FUNCTION__, mCameraId);
11321d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                    return res;
11331d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                }
11341d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                l.mParameters.state = Parameters::STILL_CAPTURE;
11351d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                break;
11361d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            case Parameters::RECORD:
11371d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                // Good to go for video snapshot
11381d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
11391d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                break;
11401d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
11411d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
11421d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                ALOGE("%s: Camera %d: Already taking a picture",
11431d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                        __FUNCTION__, mCameraId);
11441d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                return INVALID_OPERATION;
11451d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala        }
1146d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11471d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala        ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
11495282713a976184e41451315f1286d8075b257d58Igor Murashkin        res = updateProcessorStream(mJpegProcessor, l.mParameters);
11501d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala        if (res != OK) {
11511d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
11521d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
11531d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala            return res;
11541d838ceb5808a8753ec20b59deb121ec8b011fb4Eino-Ville Talvala        }
1155228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
11568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11574c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    // Need HAL to have correct settings before (possibly) triggering precapture
11584c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    syncWithDevice();
11594c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
1160786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin    res = mCaptureSequencer->startCapture(msgType);
1161d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
116269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1163d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1164d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1165d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
116669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return res;
116761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
116861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
116961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1170a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1171c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1172a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
11743a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
11753a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
11809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
11828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
11838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
118461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1185f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
118661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1187a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1188c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
1189a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11903a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return String8();
1191ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1193ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1194c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    return l.mParameters.get();
119561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
119661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
119761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1198a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1199a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12003a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
12013a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1202c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1203c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1204c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1205c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
120636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
120736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
120836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
120936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
121036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
121136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
121236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
121336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
121436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
121536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
121636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
121736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
121836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1219228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1222228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
122336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
122436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
122536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
122636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
122736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
122836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetVideoBufferCountL(arg1);
122936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
123036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
123136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1232c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
123336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
123436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
123536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
123636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
123736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
123836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
123936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
124036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
124136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
124236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
124336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
124436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
124536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
124636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
124836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
124936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
125036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
125136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
125236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
125336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
125643cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala            getPreviewStreamId() != NO_STREAM) {
125743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        mDevice->setStreamTransform(getPreviewStreamId(), transform);
125836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
126036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
126136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
126236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
126336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
12642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
126536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1267c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
126836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1269983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
127036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
127136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
127236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
127336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
127436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
127536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
127636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
127736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
127836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
127936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
128036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1281983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
128236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1283983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
128536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
128636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1287983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
128836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
128936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    mCameraService->playSound(CameraService::SOUND_RECORDING);
129036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
129136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
129236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1293ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
12948ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
12958ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
12968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
13038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
13048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
13058ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
13098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
13108ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
13118ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13128ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
13142d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
13158ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
13168ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
1317ea49f4b4ba9d182fd8a74c74d16590cb65f3a5f1Ziv Hendel        return BAD_VALUE;
13188ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
13208ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
13228ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
13248ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13258ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
132636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
132736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1328228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
13298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
13308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
13318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
13328ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1333228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
13348ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1335228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
13368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1340228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
13418ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
13428ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
13438ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
134436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
134536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
134636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1349174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
135036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
135136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
135236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
135336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
135436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1357983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
135836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
135936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
136036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
136136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
136236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
136336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetVideoBufferCountL(size_t count) {
13648da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    if (recordingEnabledL()) {
136536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting video buffer count after "
136636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                "recording was started", __FUNCTION__, mCameraId);
136736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return INVALID_OPERATION;
1368c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1369c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
137043cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    return mStreamingProcessor->setRecordingBufferCount(count);
137161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
137261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
1374160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1375160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1376160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1377174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1378174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1379174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1380174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1381174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1382174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
1384f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        l.mParameters.focusState = newState;
13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1386174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1387174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1388174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1389174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1390174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
13912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1392174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1393174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1394174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1395174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1396174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1397174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
13982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1399174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1400174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1401174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1402174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1403174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1404174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1405174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1406174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1407174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1408174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1409174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1410174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1411174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1412174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1413174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1414174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1415174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1416174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1417174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1418174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1419174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1420174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1421174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1422174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1423174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1424174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1426174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1427174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1430174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1431174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1433174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1434174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1435174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1436174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1437174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1440174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1441174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1442174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1443174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1444174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1445174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1446174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1447174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
1448174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1450174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1451174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1452174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1453174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1455174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1456174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1457174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1458174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1459174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1460174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1461a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1462a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1463a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1464a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1465174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1466174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1467174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1468174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
1469a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1470a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        if (l.mRemoteCallback != 0) {
1471a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
14728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
14738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1474174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1475603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
1476a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1477a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        if (l.mRemoteCallback != 0) {
1478a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1479a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
14808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1481603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1482160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1483160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1484160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1485160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1486160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
148769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1488160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1489160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1490a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1491a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1492c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1493c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
149469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
149543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    return mStreamingProcessor->getPreviewStreamId();
149669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
149769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
149869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
149969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return mJpegProcessor->getStreamId();
150069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
150169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
150269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
150369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
150469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
150569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
150669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
150743cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    return mStreamingProcessor->getRecordingStreamId();
150869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
150969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
151069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
151169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return mZslProcessor->getStreamId();
151269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
151369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
15154c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
15164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    return mFrameProcessor->registerListener(minId, maxId, listener);
15174c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala}
15184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
15194c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
152069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        wp<camera2::FrameProcessor::FilteredListener> listener) {
15214c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    return mFrameProcessor->removeListener(minId, maxId, listener);
152269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
152369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::stopStream() {
15254c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    return mStreamingProcessor->stopStream();
152669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
152769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15284c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart;
15294c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd;
15304c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart;
15314c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd;
15324c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart;
15334c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd;
153469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
15363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1537f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters &params) {
15388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
15398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15400cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
15410cb290b2304ef582a5afa9a45a4594944e89156eIgor Murashkin
15424c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    res = mStreamingProcessor->incrementStreamingIds();
15434c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    if (res != OK) {
15444c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
15454c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
15464c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        return res;
15474c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    }
15484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
154943cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    res = mStreamingProcessor->updatePreviewRequest(params);
15508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
15518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
15528ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
15538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
15548ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
155543cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala    res = mStreamingProcessor->updateRecordingRequest(params);
15568ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
15578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
15588ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
15598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
15608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
15618ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
1563f98cbbeb01aa15178c7a58f3c478ec1050dbe83eEino-Ville Talvala        res = startPreviewL(params, true);
15648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
15658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
15668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15688ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
157143cbdc5b5545d3344c556014b9afe8249add91e4Eino-Ville Talvala        res = startRecordingL(params, true);
15728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
15738ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
15748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
15768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
15778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
15788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
15798ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
15808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1582228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
1583228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
1584228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
1585228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
1586228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1587228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
1588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
1589228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
1590228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
1592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
1593f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
1594228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
1595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
1596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
1597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
1598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1599228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
1600228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
1601228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1602228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
1603228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
1604228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
1605228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
1606228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
1607228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
1608228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
16098ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16104c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvalastatus_t Camera2Client::syncWithDevice() {
16114c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    ATRACE_CALL();
1612b66e9d6bcc45fabd1a8490d968d58cac8e1ac70cEino-Ville Talvala    const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
16134c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    status_t res;
16144c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
16154c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
16164c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    if (activeRequestId == 0) return OK;
16174c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
16184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
16194c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    if (res == TIMED_OUT) {
16204c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
16214c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala                __FUNCTION__, mCameraId);
16224c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    } else if (res != OK) {
16234c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
16244c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala                __FUNCTION__, mCameraId);
16254c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    }
16264c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    return res;
16274c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala}
16284c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala
16295282713a976184e41451315f1286d8075b257d58Igor Murashkintemplate <typename ProcessorT>
16305282713a976184e41451315f1286d8075b257d58Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
16315282713a976184e41451315f1286d8075b257d58Igor Murashkin                                              camera2::Parameters params) {
163282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // No default template arguments until C++11, so we need this overload
163382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
163482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            processor, params);
163582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin}
163682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin
163782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT,
163882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin          status_t (ProcessorT::*updateStreamF)(const Parameters &)>
163982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
164082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                              Parameters params) {
16415282713a976184e41451315f1286d8075b257d58Igor Murashkin    status_t res;
16425282713a976184e41451315f1286d8075b257d58Igor Murashkin
164382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // Get raw pointer since sp<T> doesn't have operator->*
164482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    ProcessorT *processorPtr = processor.get();
164582db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = (processorPtr->*updateStreamF)(params);
16465282713a976184e41451315f1286d8075b257d58Igor Murashkin
16475282713a976184e41451315f1286d8075b257d58Igor Murashkin    /**
16485282713a976184e41451315f1286d8075b257d58Igor Murashkin     * Can't update the stream if it's busy?
16495282713a976184e41451315f1286d8075b257d58Igor Murashkin     *
16505282713a976184e41451315f1286d8075b257d58Igor Murashkin     * Then we need to stop the device (by temporarily clearing the request
16515282713a976184e41451315f1286d8075b257d58Igor Murashkin     * queue) and then try again. Resume streaming once we're done.
16525282713a976184e41451315f1286d8075b257d58Igor Murashkin     */
16535282713a976184e41451315f1286d8075b257d58Igor Murashkin    if (res == -EBUSY) {
16545282713a976184e41451315f1286d8075b257d58Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/true);
16555282713a976184e41451315f1286d8075b257d58Igor Murashkin        if (res != OK) {
16565282713a976184e41451315f1286d8075b257d58Igor Murashkin            ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
16575282713a976184e41451315f1286d8075b257d58Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
16585282713a976184e41451315f1286d8075b257d58Igor Murashkin        }
16595282713a976184e41451315f1286d8075b257d58Igor Murashkin
16605282713a976184e41451315f1286d8075b257d58Igor Murashkin        res = mDevice->waitUntilDrained();
16615282713a976184e41451315f1286d8075b257d58Igor Murashkin        if (res != OK) {
16625282713a976184e41451315f1286d8075b257d58Igor Murashkin            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
16635282713a976184e41451315f1286d8075b257d58Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
16645282713a976184e41451315f1286d8075b257d58Igor Murashkin        }
16655282713a976184e41451315f1286d8075b257d58Igor Murashkin
166682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin        res = (processorPtr->*updateStreamF)(params);
16675282713a976184e41451315f1286d8075b257d58Igor Murashkin        if (res != OK) {
16685282713a976184e41451315f1286d8075b257d58Igor Murashkin            ALOGE("%s: Camera %d: Failed to update processing stream "
16695282713a976184e41451315f1286d8075b257d58Igor Murashkin                  " despite having halted streaming first: %s (%d)",
16705282713a976184e41451315f1286d8075b257d58Igor Murashkin                  __FUNCTION__, mCameraId, strerror(-res), res);
16715282713a976184e41451315f1286d8075b257d58Igor Murashkin        }
16725282713a976184e41451315f1286d8075b257d58Igor Murashkin
16735282713a976184e41451315f1286d8075b257d58Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/false);
16745282713a976184e41451315f1286d8075b257d58Igor Murashkin        if (res != OK) {
16755282713a976184e41451315f1286d8075b257d58Igor Murashkin            ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
16765282713a976184e41451315f1286d8075b257d58Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
16775282713a976184e41451315f1286d8075b257d58Igor Murashkin        }
16785282713a976184e41451315f1286d8075b257d58Igor Murashkin    }
16795282713a976184e41451315f1286d8075b257d58Igor Murashkin
16805282713a976184e41451315f1286d8075b257d58Igor Murashkin    return res;
16815282713a976184e41451315f1286d8075b257d58Igor Murashkin}
1682a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin
168361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
1684