Camera2Client.cpp revision 8b0b971b1416738f22488a80be726d1ec12552a8
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
17cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He#define LOG_TAG "Camera2Client"
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
21377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT#include <inttypes.h>
22f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
23a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h>
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
27d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceCallbacks.h>
2861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h"
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/StreamingProcessor.h"
327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/JpegProcessor.h"
337b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CaptureSequencer.h"
347b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CallbackProcessor.h"
357b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessor.h"
36ae500e53efa1d26eb7c13e62d0ecc8d75db2473aIgor Murashkin
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalausing namespace camera2;
422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
50d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        const sp<hardware::ICameraClient>& cameraClient,
51ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        const String16& clientPackageName,
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
54ecf17e82505fdb60d59e00b6dd59036df93de655Igor Murashkin        int clientPid,
55ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        uid_t clientUid,
56a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        int servicePid,
57a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        bool legacyMode):
5844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
59ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                cameraId, cameraFacing, clientPid, clientUid, servicePid),
60cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        mParameters(cameraId, cameraFacing)
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
62a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
63228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.state = Parameters::DISCONNECTED;
66a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin
67a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    mLegacyMode = legacyMode;
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
70e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yehstatus_t Camera2Client::initialize(CameraModule *module)
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
72a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
73c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
76e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin    res = Camera2ClientBase::initialize(module);
77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    if (res != OK) {
78ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        return res;
79ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    }
80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
81fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    {
82fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
83fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
84cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        res = l.mParameters.initialize(&(mDevice->info()), mDeviceVersion);
85fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        if (res != OK) {
86fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
87fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
88fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            return NO_INIT;
89fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        }
90f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 threadName;
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
9473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor = new StreamingProcessor(this);
95254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala    threadName = String8::format("C2-%d-StreamProc",
96254446a80cb13d5beb606bfc3e60a17473869478Eino-Ville Talvala            mCameraId);
9773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
98ce124da179775a81ad7dcc3f33315eca451e66f2Igor Murashkin    mFrameProcessor = new FrameProcessor(mDevice, this);
994bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-FrameProc",
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mFrameProcessor->run(threadName.string());
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer = new CaptureSequencer(this);
1044bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CaptureSeq",
105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->run(threadName.string());
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor = new JpegProcessor(this, mCaptureSequencer);
1094bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-JpegProc",
110ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala            mCameraId);
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mJpegProcessor->run(threadName.string());
112ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
113d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    mZslProcessor = new ZslProcessor(this, mCaptureSequencer);
114d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
1154bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-ZslProc",
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
117d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    mZslProcessor->run(threadName.string());
118ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala
119d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala    mCallbackProcessor = new CallbackProcessor(this);
1204bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala    threadName = String8::format("C2-%d-CallbkProc",
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mCameraId);
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCallbackProcessor->run(threadName.string());
123d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala
124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
125fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
127f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGD("%s", l.mParameters.paramsFlattened.string());
129f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
130f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
131f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
13261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
13361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
13461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
135a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
136d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    ALOGV("~Camera2Client");
1374ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
138f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
139f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
140c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    disconnect();
141c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGI("Camera %d: Closed", mCameraId);
14361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
14461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
146c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala    return BasicClient::dump(fd, args);
147c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala}
148c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvala
149c4003965258404a19b99280ac0f475e2f290bf27Eino-Ville Talvalastatus_t Camera2Client::dumpClient(int fd, const Vector<String16>& args) {
150611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
151cc776718c0be7c31fe5ab4fc1446d377be60369fRuben Brunk    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n", mCameraId,
152e992e75053e98e3699af6e344c11b787e30411adEino-Ville Talvala            (getRemoteCallback() != NULL ?
153f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen                    (IInterface::asBinder(getRemoteCallback()).get()) : NULL),
154611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const Parameters& p = mParameters.unsafeAccess();
159836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala
1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    result.append(Parameters::getStateName(p.state));
1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1624ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
164836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewWidth, p.previewHeight);
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
166836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFpsRange[0], p.previewFpsRange[1]);
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
168836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewFormat);
16911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
170836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.previewTransform);
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
172836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.pictureWidth, p.pictureHeight);
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
174836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegThumbSize[0], p.jpegThumbSize[1]);
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
176836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.jpegQuality, p.jpegThumbQuality);
177836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", p.jpegRotation);
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
179836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.gpsEnabled ? "enabled" : "disabled");
180836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    if (p.gpsEnabled) {
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
182836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[0], p.gpsCoordinates[1],
183836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsCoordinates[2]);
184377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT        result.appendFormat("    GPS timestamp: %" PRId64 "\n",
185836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsTimestamp);
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
187836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.gpsProcessingMethod.string());
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
191836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.wbMode) {
192d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_AUTO)
193d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_INCANDESCENT)
194d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_FLUORESCENT)
195d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT)
196d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_DAYLIGHT)
197d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT)
198d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_TWILIGHT)
199d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_MODE_SHADE)
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
204836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.effectMode) {
205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_OFF)
206d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_MONO)
207d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_NEGATIVE)
208d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SOLARIZE)
209d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_SEPIA)
210d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_POSTERIZE)
211d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD)
212d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD)
213d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MODE_AQUA)
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
218836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.antibandingMode) {
219d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO)
220d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
221d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ)
222d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
227836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.sceneMode) {
228c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk        case ANDROID_CONTROL_SCENE_MODE_DISABLED:
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
249836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.flashMode) {
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
260836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    switch (p.focusMode) {
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
272d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    result.append("   Focus state: ");
273d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    switch (p.focusState) {
274d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_INACTIVE)
275d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN)
276d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)
2774ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED)
278d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN)
279d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED)
280d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED)
281d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        default: result.append("UNKNOWN\n");
282d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    }
283d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala
2847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
285836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.focusingAreas.size(); i++) {
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
287836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].left,
288836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].top,
289836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].right,
290836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].bottom,
291836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.focusingAreas[i].weight);
2927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
295836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.exposureCompensation);
2967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
298836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoExposureLock ? "enabled" : "disabled",
299836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.autoWhiteBalanceLock ? "enabled" : "disabled" );
3007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
302836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    for (size_t i = 0; i < p.meteringAreas.size(); i++) {
3037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
304836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].left,
305836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].top,
306836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].right,
307836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].bottom,
308836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala                p.meteringAreas[i].weight);
3097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
3107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
311836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", p.zoom);
312836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", p.videoWidth,
313836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoHeight);
3147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3153297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
316836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.recordingHint ? "set" : "not set");
3177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3183297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
319836b81f3c5a5bacb800f698f90ded6bd6e6bc5ceEino-Ville Talvala            p.videoStabilization ? "enabled" : "disabled");
3207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
3210181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    result.appendFormat("    Selected still capture FPS range: %d - %d\n",
3220181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[0],
3230181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            p.fastInfo.bestStillCaptureFpsRange[1]);
3240181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
325c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    result.appendFormat("    Use zero shutter lag: %s\n",
326c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala            p.useZeroShutterLag() ? "yes" : "no");
327c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala
3283297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n",
330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getPreviewStreamId());
331ea0d51b5ed0b474433b02414f9133b835f972569Eino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n",
332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getCaptureStreamId());
333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.appendFormat("    Recording stream ID: %d\n",
334da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            getRecordingStreamId());
335e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
336e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    result.append("  Quirks for this camera:\n");
337e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    bool haveQuirk = false;
338e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.triggerAfWithAuto) {
339e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    triggerAfWithAuto\n");
340e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
341e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
342e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (p.quirks.useZslFormat) {
343e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    useZslFormat\n");
344e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        haveQuirk = true;
345e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
3467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (p.quirks.meteringCropRegion) {
3477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        result.appendFormat("    meteringCropRegion\n");
3487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        haveQuirk = true;
3497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
350fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    if (p.quirks.partialResults) {
351fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        result.appendFormat("    usePartialResult\n");
352fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        haveQuirk = true;
353fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    }
354e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (!haveQuirk) {
355e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala        result.appendFormat("    none\n");
356e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    }
357e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
35873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    write(fd, result.string(), result.size());
3593297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
36073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    mStreamingProcessor->dump(fd, args);
361428b77a2b94b74665a47375b3fdb893b98d71269Eino-Ville Talvala
362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->dump(fd, args);
363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
364c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala    mFrameProcessor->dump(fd, args);
365c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
36697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala    mZslProcessor->dump(fd, args);
36797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala
36844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    return dumpDevice(fd, args);
3697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
37061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
37161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
37261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
37361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
374d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalabinder::Status Camera2Client::disconnect() {
375a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
37644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
377c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala
378d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    binder::Status res = binder::Status::ok();
37998a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen    // Allow both client and the cameraserver to disconnect at all times
380c03792041b9dd6f7f54abd6c82bd6c755a336cd8Eino-Ville Talvala    int callingPid = getCallingPid();
381d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (callingPid != mClientPid && callingPid != mServicePid) return res;
382ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
383d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (mDevice == 0) return res;
384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
38598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Shutting down", mCameraId);
38698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
387d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala    /**
388d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * disconnect() cannot call any methods that might need to promote a
389d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * wp<Camera2Client>, since disconnect can be called from the destructor, at
390d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     * which point all such promotions will fail.
391d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala     */
392d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala
393d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    stopPreviewL();
3946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
39598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    {
39698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
397d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        if (l.mParameters.state == Parameters::DISCONNECTED) return res;
39898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala        l.mParameters.state = Parameters::DISCONNECTED;
39998bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    }
40098bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mFrameProcessor->requestExit();
40298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCaptureSequencer->requestExit();
40398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mJpegProcessor->requestExit();
404d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    mZslProcessor->requestExit();
40598bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mCallbackProcessor->requestExit();
40698bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
40798bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Waiting for threads", mCameraId);
40898bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
409661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala    {
410661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        // Don't wait with lock held, in case the other threads need to
411661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        // complete callbacks that re-enter Camera2Client
412661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mBinderSerializationLock.unlock();
413661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala
414661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mFrameProcessor->join();
415661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mCaptureSequencer->join();
416661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mJpegProcessor->join();
417d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        mZslProcessor->join();
418661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mCallbackProcessor->join();
419661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala
420661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala        mBinderSerializationLock.lock();
421661c21da5592ca48256747ec220efb2e599eeb72Eino-Ville Talvala    }
42298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
423dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    ALOGV("Camera %d: Deleting streams", mCameraId);
424dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk
425dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mStreamingProcessor->deletePreviewStream();
426dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mStreamingProcessor->deleteRecordingStream();
427dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mJpegProcessor->deleteStream();
428dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mCallbackProcessor->deleteStream();
429dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk    mZslProcessor->deleteStream();
430dfe715582943b3fc9bab91f88257a3bba6c6deefRuben Brunk
43198bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    ALOGV("Camera %d: Disconnecting device", mCameraId);
43298bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
43398bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala    mDevice->disconnect();
43498bb82d1bf7c94240956426812de6593801faad4Eino-Ville Talvala
4353a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    mDevice.clear();
4368ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
43761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
438d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
439d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    return res;
44061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
44161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
442d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<hardware::ICameraClient>& client) {
443a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4449e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
44544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor 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
45644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mRemoteCallback = client;
45744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor 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__);
46544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor 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__);
48644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor 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()) {
491907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        SharedParameters::Lock l(mParameters);
492907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        if (l.mParameters.state == Parameters::RECORD ||
493907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala                l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
494907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            ALOGD("Not allowed to unlock camera during recording.");
495907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala            return INVALID_OPERATION;
496907e5651c18d0e25073743a49a685fe1a385939aEino-Ville Talvala        }
4979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
49844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mRemoteCallback.clear();
49944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor 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
5081ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvalastatus_t Camera2Client::setPreviewTarget(
5098ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer>& bufferProducer) {
510a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5119e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
51244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor 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;
517727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala    sp<Surface> window;
5188ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != 0) {
519f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen        binder = IInterface::asBinder(bufferProducer);
5201ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // Using controlledByApp flag to ensure that the buffer queue remains in
5211ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // async mode for the old camera API, where many applications depend
5221ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        // on that behavior.
5231ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala        window = new Surface(bufferProducer, /*controlledByApp*/ true);
5246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
52536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return setPreviewWindowL(binder, window);
5266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
52836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::setPreviewWindowL(const sp<IBinder>& binder,
5298b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh        const sp<Surface>& window) {
530a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5316db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
5349e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
5359e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
5366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
5376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
539f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    Parameters::State state;
540f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    {
541f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
542f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        state = l.mParameters.state;
543f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    }
544f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    switch (state) {
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
5499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
551f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala                    Parameters::getStateName(state));
5529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
5559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
5569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
5589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
559d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
560d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
561d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Unable to stop preview to swap windows: %s (%d)",
562d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, strerror(-res), res);
563d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                return res;
564d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
565f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala            state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
5669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
5679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
5689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
569bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
57073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->setPreviewWindow(window);
57173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (res != OK) {
57273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Unable to set new preview window: %s (%d)",
57373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
57473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        return res;
57573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
576bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
577f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala    if (state == Parameters::WAITING_FOR_PREVIEW_WINDOW) {
578f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        SharedParameters::Lock l(mParameters);
579f1945f0435e431fab2e6b83337a1ffe71a8df28cEino-Ville Talvala        l.mParameters.state = state;
5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return startPreviewL(l.mParameters, false);
5816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
58461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
58561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
58661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
587a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
588228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    ALOGV("%s: Camera %d: Flag 0x%x", __FUNCTION__, mCameraId, flag);
58944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
590ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkin
591228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return;
592228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    setPreviewCallbackFlagL(l.mParameters, flag);
595228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
596228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
597228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
598228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res = OK;
599a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
600a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    switch(params.state) {
601a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::STOPPED:
602a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
603a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        case Parameters::PREVIEW:
604a2520db02bead68d4980783c41500ae96511bdf8Zhijun He        case Parameters::STILL_CAPTURE:
605a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            // OK
606a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            break;
607a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        default:
608a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
609a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't use preview callbacks "
610a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "in state %d", __FUNCTION__, mCameraId, params.state);
611a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return;
612a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
613a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
614a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
615228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
616228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        ALOGV("%s: setting oneshot", __FUNCTION__);
617228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackOneShot = true;
618228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
619228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (params.previewCallbackFlags != (uint32_t)flag) {
6203ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
621527748abf04c0060894fd7aace54959a2c343435Zhijun He        if (params.previewCallbackSurface && flag != CAMERA_FRAME_CALLBACK_FLAG_NOOP) {
6223ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Disable any existing preview callback window when enabling
6233ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // preview callback flags
6243ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = mCallbackProcessor->setCallbackWindow(NULL);
6253ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            if (res != OK) {
6263ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to clear preview callback surface:"
6273ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                        " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
6283ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                return;
6293ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            }
6303ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface = false;
6313ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6323ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
633228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        params.previewCallbackFlags = flag;
6343ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
635a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (params.state == Parameters::PREVIEW) {
636228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, true);
637a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
638a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to refresh request in state %s",
639a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        __FUNCTION__, mCameraId,
640a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        Parameters::getStateName(params.state));
641a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
6423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        }
6433ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6443ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala}
6453ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6463ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvalastatus_t Camera2Client::setPreviewCallbackTarget(
6473ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        const sp<IGraphicBufferProducer>& callbackProducer) {
6483ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ATRACE_CALL();
6493ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
6503ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    Mutex::Autolock icl(mBinderSerializationLock);
6513ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    status_t res;
6523ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
6533ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
654727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala    sp<Surface> window;
6553ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (callbackProducer != 0) {
6563ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        window = new Surface(callbackProducer);
6573ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    res = mCallbackProcessor->setCallbackWindow(window);
6603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
6613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview callback surface: %s (%d)",
6623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        return res;
6643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
6673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (window != NULL) {
6693ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable traditional callbacks when a valid callback target is given
6703ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackFlags = CAMERA_FRAME_CALLBACK_FLAG_NOOP;
6713ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackOneShot = false;
6723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = true;
6733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    } else {
6743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        // Disable callback target if given a NULL interface.
6753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        l.mParameters.previewCallbackSurface = false;
6763ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6773ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
6783ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    switch(l.mParameters.state) {
6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
6803ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startPreviewL(l.mParameters, true);
681228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
6843ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            res = startRecordingL(l.mParameters, true);
685228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
686228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
687228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            break;
6883ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    }
6893ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    if (res != OK) {
6903ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to refresh request in state %s",
6913ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                __FUNCTION__, mCameraId,
6923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                Parameters::getStateName(l.mParameters.state));
693228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
694228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
6953ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    return OK;
69661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
69761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
6983ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
69961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
700a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
7019e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
70244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
7033a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
7043a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startPreviewL(l.mParameters, false);
707d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
708ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
709228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
710d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
7116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
71222d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
71322d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
71422d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
715a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala    if ( (params.state == Parameters::PREVIEW ||
716a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::RECORD ||
717a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                    params.state == Parameters::VIDEO_SNAPSHOT)
718a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala            && !restart) {
719a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        // Succeed attempt to re-enter a streaming state
720a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala        ALOGI("%s: Camera %d: Preview already active, ignoring restart",
721a14be59340219c47639ec77a352d2af362551a6fEino-Ville Talvala                __FUNCTION__, mCameraId);
72277449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray        return OK;
72377449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    }
72477449ada4b5ca73a948aa4fef9aafe3079a66d61Alex Ray    if (params.state > Parameters::PREVIEW && !restart) {
7254ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                Parameters::getStateName(params.state));
7284ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
7294ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
7306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
73173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!mStreamingProcessor->haveValidPreviewWindow()) {
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::WAITING_FOR_PREVIEW_WINDOW;
7336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
7346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::STOPPED;
736c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    int lastPreviewStreamId = mStreamingProcessor->getPreviewStreamId();
7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
73873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewStream(params);
739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
7436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
74473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
745c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    bool previewStreamChanged = mStreamingProcessor->getPreviewStreamId() != lastPreviewStreamId;
746c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He
747a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // We could wait to create the JPEG output stream until first actual use
748a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // (first takePicture call). However, this would substantially increase the
749d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // first capture latency on HAL3 devices.
750d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // So create it unconditionally at preview start. As a drawback,
751a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // this increases gralloc memory consumption for applications that don't
752355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    // ever take a picture. Do not enter this mode when jpeg stream will slow
753355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    // down preview.
754a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // TODO: Find a better compromise, though this likely would involve HAL
755a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    // changes.
756e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He    int lastJpegStreamId = mJpegProcessor->getStreamId();
757355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    // If jpeg stream will slow down preview, make sure we remove it before starting preview
758355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (params.slowJpegMode) {
759355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        mJpegProcessor->deleteStream();
760355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    } else {
761355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        res = updateProcessorStream(mJpegProcessor, params);
762355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        if (res != OK) {
763355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            ALOGE("%s: Camera %d: Can't pre-configure still image "
764355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                    "stream: %s (%d)",
765355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                    __FUNCTION__, mCameraId, strerror(-res), res);
766355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            return res;
767355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
768a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala    }
769e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He    bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId;
770a9c64a9398ac2e6173f99e252f305808a34cab1cEino-Ville Talvala
771d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
7723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    bool callbacksEnabled = (params.previewCallbackFlags &
7733ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ||
7743ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            params.previewCallbackSurface;
7753ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
776228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (callbacksEnabled) {
777a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // Can't have recording stream hanging around when enabling callbacks,
778a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        // since it exceeds the max stream count on some devices.
779a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
780a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGV("%s: Camera %d: Clearing out recording stream before "
781a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "creating callback stream", __FUNCTION__, mCameraId);
782a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->stopStream();
783a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
784a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming to delete "
785a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "recording stream", __FUNCTION__, mCameraId);
786a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
787a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
788a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            res = mStreamingProcessor->deleteRecordingStream();
789a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            if (res != OK) {
790a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete recording stream before "
791a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId,
792a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                        strerror(-res), res);
793a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                return res;
794a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            }
795a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
796a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
797d86a6880fe86bda21a9b53b240996fc410a512a5Eino-Ville Talvala        res = mCallbackProcessor->updateStream(params);
798228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        if (res != OK) {
799228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
800228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
801228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return res;
802228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
80373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getCallbackStreamId());
804c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He    } else if (previewStreamChanged && mCallbackProcessor->getStreamId() != NO_STREAM) {
805c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        /**
806c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * Delete the unused callback stream when preview stream is changed and
807c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * preview is not enabled. Don't need stop preview stream as preview is in
808c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         * STOPPED state now.
809c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He         */
810c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        ALOGV("%s: Camera %d: Delete unused preview callback stream.",  __FUNCTION__, mCameraId);
811c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        res = mCallbackProcessor->deleteStream();
812c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        if (res != OK) {
813c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            ALOGE("%s: Camera %d: Unable to delete callback stream %s (%d)",
814c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He                    __FUNCTION__, mCameraId, strerror(-res), res);
815c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He            return res;
816c1b7cc4d3eeb55fd03ff77b099b827e7568480e4Zhijun He        }
817228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
818ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
819c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    if (params.useZeroShutterLag() &&
820ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh            getRecordingStreamId() == NO_STREAM) {
821dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = updateProcessorStream(mZslProcessor, params);
822da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
823da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update ZSL stream: %s (%d)",
824da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
825da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
826da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
827e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He
828e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        if (jpegStreamChanged) {
829e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed",
830e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                    __FUNCTION__, mCameraId);
831e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            mZslProcessor->clearZslQueue();
832e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        }
83373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        outputStreams.push(getZslStreamId());
834661076292093f82aec488baf8460cdf204a5efd2Zhijun He    } else {
835661076292093f82aec488baf8460cdf204a5efd2Zhijun He        mZslProcessor->deleteStream();
836da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
8376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
83873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
83973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala
8405a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    if (!params.recordingHint) {
84173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
84273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updatePreviewRequest(params);
8435a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            if (res != OK) {
84473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request: "
84573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId,
84673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
8475a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                return res;
8485a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala            }
8495a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        }
85073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
85173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
8525a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    } else {
85373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (!restart) {
85473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            res = mStreamingProcessor->updateRecordingRequest(params);
85573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            if (res != OK) {
85673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                ALOGE("%s: Camera %d: Can't set up preview request with "
85773bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        "record hint: %s (%d)", __FUNCTION__, mCameraId,
85873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                        strerror(-res), res);
85973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                return res;
86073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            }
86173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
86273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
86373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                outputStreams);
864be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
865be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
86673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start streaming preview: %s (%d)",
867be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
8686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
8696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
8706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.state = Parameters::PREVIEW;
8726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
87361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
87461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
87561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
876a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8779e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
87844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
8793a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
8803a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
88136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    stopPreviewL();
882ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
883ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
88436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalavoid Camera2Client::stopPreviewL() {
885ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
8864865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
887d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    const nsecs_t kStopCaptureTimeout = 3000000000LL; // 3 seconds
8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::State state;
889228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    {
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        state = l.mParameters.state;
892228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
893228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
894228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (state) {
8952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
896ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala            // Nothing to do.
897d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
899d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
901d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            mCaptureSequencer->waitUntilIdle(kStopCaptureTimeout);
902d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            // no break
9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
905a27c4aa222c8dd1712617dad954c5f3aa68d5427Ruben Brunk            syncWithDevice();
906d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            res = stopStream();
907d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            if (res != OK) {
908d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
909d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
910d09801b99503b57c35e321ad9afa7e861e012813Eino-Ville Talvala            }
9112cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma
9122cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            // Flush all in-process captures and buffer in order to stop
9132cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            // preview faster.
9142cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            res = mDevice->flush();
9152cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            if (res != OK) {
9162cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma                ALOGE("%s: Camera %d: Unable to flush pending requests: %s (%d)",
9172cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma                        __FUNCTION__, mCameraId, strerror(-res), res);
9182cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma            }
9192cec0dfa9f97b87733b8b250b49729fc6bb3a60aRuchit Sharma
9204865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            res = mDevice->waitUntilDrained();
9214865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            if (res != OK) {
9224865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
9234865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                        __FUNCTION__, mCameraId, strerror(-res), res);
9244865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            }
92528d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            // Clean up recording stream
92628d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            res = mStreamingProcessor->deleteRecordingStream();
92728d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            if (res != OK) {
92828d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                ALOGE("%s: Camera %d: Unable to delete recording stream before "
92928d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                        "stop preview: %s (%d)",
93028d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh                        __FUNCTION__, mCameraId, strerror(-res), res);
93128d0327bc80e1e424c3db34c62e8f73cd5ffab1eYin-Chia Yeh            }
932228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // no break
9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW: {
9342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
9352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
9362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            commandStopFaceDetectionL(l.mParameters);
937d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
938228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
939d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
940d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
941228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    state);
942d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
94361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
94461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
94561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
946a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
94744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9483a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9493a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return false;
9503a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return l.mParameters.state == Parameters::PREVIEW;
95361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
95461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9558cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenstatus_t Camera2Client::setVideoBufferMode(int32_t videoBufferMode) {
956a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
95744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
9593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
9632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
9642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
96578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            ALOGE("%s: Camera %d: Can't be called in state %s",
9662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
9672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
96878822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            return INVALID_OPERATION;
96978822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        default:
97078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            // OK
97178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala            break;
97278822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
97378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
9748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (videoBufferMode != VIDEO_BUFFER_MODE_BUFFER_QUEUE) {
9758cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGE("%s: %d: Only video buffer queue is supported", __FUNCTION__, __LINE__);
9768cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        return BAD_VALUE;
9778cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
9788cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
9798cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    l.mParameters.videoBufferMode = videoBufferMode;
98078822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
98178822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    return OK;
98261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
98361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
98461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
985a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
9869e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
98744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
9889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
9893a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
991228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
9922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return startRecordingL(l.mParameters, false);
993228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
9943a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
995228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
996228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    status_t res;
99722d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
99822d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: state == %d, restart = %d", __FUNCTION__, params.state, restart);
99922d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
1000228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (params.state) {
10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
1002228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            res = startPreviewL(params, false);
10039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
100496ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            // Make sure first preview request is submitted to the HAL device to avoid
100596ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            // two consecutive set of configure_streams being called into the HAL.
100696ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            // TODO: Refactor this to avoid initial preview configuration.
100796ff5c48a81f3f45c384113480bf5e28620a72aeZhijun He            syncWithDevice();
10089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
10092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
10109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
10119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
1014228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // OK to call this when recording is already on, just skip unless
1015228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            // we're looking to restart
1016228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            if (!restart) return OK;
10179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
10189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
10199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
10202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
10212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(params.state));
10229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
10239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
10249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
10258cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (params.videoBufferMode != VIDEO_BUFFER_MODE_BUFFER_QUEUE) {
10268cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGE("%s: Camera %d: Recording only supported buffer queue mode, but "
10278cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                "mode %d is requested!", __FUNCTION__, mCameraId, params.videoBufferMode);
10288cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        return INVALID_OPERATION;
10298cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
10308cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
10318cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (!mStreamingProcessor->haveValidRecordingWindow()) {
10328cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGE("%s: No valid recording window", __FUNCTION__);
103378822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala        return INVALID_OPERATION;
103478822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala    }
103578822d73af1e7f6b8b297fc7f98ef7f8257cc10aEino-Ville Talvala
103673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    if (!restart) {
103782104ebbb2cc04277ab07b355f38f73045a11770Chien-Yu Chen        mCameraService->playSound(CameraService::SOUND_RECORDING_START);
103873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mStreamingProcessor->updateRecordingRequest(params);
103973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        if (res != OK) {
104073bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
104173bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
104273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            return res;
104373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        }
104473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    }
1045609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
1046a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Not all devices can support a preview callback stream and a recording
1047a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // stream at the same time, so assume none of them can.
1048a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    if (mCallbackProcessor->getStreamId() != NO_STREAM) {
1049a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Clearing out callback stream before "
1050a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                "creating recording stream", __FUNCTION__, mCameraId);
1051a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mStreamingProcessor->stopStream();
1052a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1053a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
1054a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1055a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1056a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1057a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        res = mCallbackProcessor->deleteStream();
1058a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        if (res != OK) {
1059a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to delete callback stream before "
1060a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    "record: %s (%d)", __FUNCTION__, mCameraId,
1061a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                    strerror(-res), res);
1062a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala            return res;
1063a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        }
1064a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    }
1065ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
1066d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // Clean up ZSL before transitioning into recording
1067d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    if (mZslProcessor->getStreamId() != NO_STREAM) {
1068d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        ALOGV("%s: Camera %d: Clearing out zsl stream before "
1069d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                "creating recording stream", __FUNCTION__, mCameraId);
1070d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        res = mStreamingProcessor->stopStream();
1071d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        if (res != OK) {
1072d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
1073d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    __FUNCTION__, mCameraId);
1074d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            return res;
1075d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        }
1076d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        res = mDevice->waitUntilDrained();
1077d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        if (res != OK) {
1078d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1079d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1080d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        }
1081d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        res = mZslProcessor->clearZslQueue();
1082d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        if (res != OK) {
1083d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            ALOGE("%s: Camera %d: Can't clear zsl queue",
1084d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    __FUNCTION__, mCameraId);
1085d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            return res;
1086d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        }
1087d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        res = mZslProcessor->deleteStream();
1088d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        if (res != OK) {
1089d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to delete zsl stream before "
1090d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    "record: %s (%d)", __FUNCTION__, mCameraId,
1091d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    strerror(-res), res);
1092d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            return res;
1093ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh        }
1094ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh    }
1095ca05ebd4c666322e754ac63236c8b329dbb53b00Yin-Chia Yeh
1096a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // Disable callbacks if they're enabled; can't record and use callbacks,
1097a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    // and we can't fail record start without stagefright asserting.
1098a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala    params.previewCallbackFlags = 0;
1099a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala
1100d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // May need to reconfigure video snapshot JPEG sizes
1101d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // during recording startup, so need a more complex sequence here to
1102d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // ensure an early stream reconfiguration doesn't happen
1103d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    bool recordingStreamNeedsUpdate;
1104d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    res = mStreamingProcessor->recordingStreamNeedsUpdate(params, &recordingStreamNeedsUpdate);
1105d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    if (res != OK) {
1106d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        ALOGE("%s: Camera %d: Can't query recording stream",
1107d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                __FUNCTION__, mCameraId);
1108d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        return res;
1109d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    }
1110d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
1111d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    if (recordingStreamNeedsUpdate) {
1112d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        // Need to stop stream here so updateProcessorStream won't trigger configureStream
1113d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        // Right now camera device cannot handle configureStream failure gracefully
1114d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        // when device is streaming
1115d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        res = mStreamingProcessor->stopStream();
1116a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        if (res != OK) {
1117d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop streaming to update record "
1118d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    "stream", __FUNCTION__, mCameraId);
1119a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh            return res;
1120a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        }
1121d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        res = mDevice->waitUntilDrained();
1122d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala        if (res != OK) {
1123d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            ALOGE("%s: Camera %d: Waiting to stop streaming failed: "
1124d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId,
1125d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    strerror(-res), res);
1126a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        }
1127d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
1128a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        res = updateProcessorStream<
1129d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            StreamingProcessor,
1130d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            &StreamingProcessor::updateRecordingStream>(
1131d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                                                        mStreamingProcessor,
1132d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                                                        params);
1133a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        if (res != OK) {
1134d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to update recording stream: "
1135d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId,
1136d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala                    strerror(-res), res);
1137a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh            return res;
1138a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        }
1139a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    }
1140a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh
1141d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
114273bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getPreviewStreamId());
114373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    outputStreams.push(getRecordingStreamId());
11449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
114573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
114673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            outputStreams);
11473ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
1148a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    // startStream might trigger a configureStream call and device might fail
1149a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    // configureStream due to jpeg size > video size. Try again with jpeg size overridden
1150a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    // to video size.
1151a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    if (res == BAD_VALUE) {
1152a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        overrideVideoSnapshotSize(params);
11533ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        res = mStreamingProcessor->startStream(StreamingProcessor::RECORD,
11543ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh                outputStreams);
11553ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
11563ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
11579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
115873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start recording stream: %s (%d)",
11599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
11609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
11619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
11629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state < Parameters::RECORD) {
11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.state = Parameters::RECORD;
1165228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
11669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
11679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
116861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
116961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
117061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
1171a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
11729e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
117344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
1175228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala
11769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
11773a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return;
11783a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
11819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
11829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
11842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
11852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
11879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
11889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, mCameraId,
11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
11919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
11929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
11939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
119482104ebbb2cc04277ab07b355f38f73045a11770Chien-Yu Chen    mCameraService->playSound(CameraService::SOUND_RECORDING_STOP);
1195609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
11968cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // Remove recording stream because the video target may be abandoned soon.
11978cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    res = stopStream();
11988cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (res != OK) {
11998cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGE("%s: Camera %d: Can't stop streaming: %s (%d)",
12008cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                __FUNCTION__, mCameraId, strerror(-res), res);
1201092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh    }
1202092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh
12038cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    res = mDevice->waitUntilDrained();
12048cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (res != OK) {
12058cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
12068cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                __FUNCTION__, mCameraId, strerror(-res), res);
12078cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
12088cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // Clean up recording stream
12098cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    res = mStreamingProcessor->deleteRecordingStream();
12108cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (res != OK) {
12118cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGE("%s: Camera %d: Unable to delete recording stream before "
12128cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                "stop preview: %s (%d)",
12138cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                __FUNCTION__, mCameraId, strerror(-res), res);
12148cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
12158cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    l.mParameters.recoverOverriddenJpegSize();
12168cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
12178cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    // Restart preview
12185a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala    res = startPreviewL(l.mParameters, true);
12199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
12205a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to return to preview",
12215a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala                __FUNCTION__, mCameraId);
12229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
122361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
122461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
122561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
1226a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
122744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12288da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
12293a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( checkPid(__FUNCTION__) != OK) return false;
12303a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
12318da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    return recordingEnabledL();
12328da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong}
12338da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
12348da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dongbool Camera2Client::recordingEnabledL() {
12358da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong    ATRACE_CALL();
12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
12378da4cd7d706d9f551bf2d08cd8b61907a10cd38dJames Dong
12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (l.mParameters.state == Parameters::RECORD
12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || l.mParameters.state == Parameters::VIDEO_SNAPSHOT);
124061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
124161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
124261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
124398a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen    (void)mem;
1244a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
12458cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    ALOGW("%s: Not supported in buffer queue mode.", __FUNCTION__);
124661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
124761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12482d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chenvoid Camera2Client::releaseRecordingFrameHandle(native_handle_t *handle) {
12492d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    (void)handle;
12502d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    ATRACE_CALL();
12512d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    ALOGW("%s: Not supported in buffer queue mode.", __FUNCTION__);
12522d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen}
12532d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen
125461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
1255a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
125644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
12578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
12583a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
12593a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
12603a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1261174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1262d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifyImmediately = false;
1263d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    bool notifySuccess = false;
1264174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
12664865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        if (l.mParameters.state < Parameters::PREVIEW) {
1267f79f8ca07f9130d67ba575748cf3481f32dcad9fZhijun He            ALOGE("%s: Camera %d: Call autoFocus when preview is inactive (state = %d).",
1268f79f8ca07f9130d67ba575748cf3481f32dcad9fZhijun He                    __FUNCTION__, mCameraId, l.mParameters.state);
12694865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala            return INVALID_OPERATION;
12704865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        }
12714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
12725f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        /**
12735f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * If the camera does not support auto-focus, it is a no-op and
12745f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * onAutoFocus(boolean, Camera) callback will be called immediately
12755f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          * with a fake value of success set to true.
12769454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          *
12779454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * Similarly, if focus mode is set to INFINITY, there's no reason to
12789454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala          * bother the HAL.
12795f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin          */
12809454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
12819454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
1282d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1283d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1284d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1285d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1286d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * If we're in CAF mode, and AF has already been locked, just fire back
1287d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * the callback right away; the HAL would not send a notification since
1288d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * no state change would happen on a AF trigger.
1289d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1290d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if ( (l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_PICTURE ||
1291d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_CONTINUOUS_VIDEO) &&
1292d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                l.mParameters.focusState == ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED ) {
1293d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifyImmediately = true;
1294d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala            notifySuccess = true;
1295d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        }
1296d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1297d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Send immediate notification back to client
1298d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
1299d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        if (notifyImmediately) {
130044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
130144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            if (l.mRemoteCallback != 0) {
130244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin                l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1303d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala                        notifySuccess ? 1 : 0, 0);
13045f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            }
13055f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin            return OK;
13065f0714eb039c07554bef6ec289c70ed1164fdf52Igor Murashkin        }
1307d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        /**
1308d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         * Handle quirk mode for AF in scene modes
1309d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala         */
131095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.quirks.triggerAfWithAuto &&
1311c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk                l.mParameters.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED &&
1312ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                l.mParameters.focusMode != Parameters::FOCUS_MODE_AUTO &&
1313ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala                !l.mParameters.focusingAreas[0].isEmpty()) {
131495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Switching from focusMode %d to AUTO",
131595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    __FUNCTION__, l.mParameters.focusMode);
131695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = l.mParameters.focusMode;
131795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
131895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
131995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
132095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.currentAfTriggerId = ++l.mParameters.afTriggerCounter;
13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = l.mParameters.currentAfTriggerId;
1323174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
13242b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kAutofocusLabel, triggerId);
13252b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
13264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1327174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1328174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerAutofocus(triggerId);
1329174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
13306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
133161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
133261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
133361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
1334a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
133544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
13368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
13373a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
13383a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
13393a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
1340174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    int triggerId;
1341174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
13439454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        // Canceling does nothing in FIXED or INFINITY modes
13449454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        if (l.mParameters.focusMode == Parameters::FOCUS_MODE_FIXED ||
13459454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala                l.mParameters.focusMode == Parameters::FOCUS_MODE_INFINITY) {
13469454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala            return OK;
13479454a9710b13c7d9262fe1cbd910235a3cd35f20Eino-Ville Talvala        }
13482b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
13492b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // An active AF trigger is canceled
13502b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afTriggerCounter == l.mParameters.currentAfTriggerId) {
13512b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(kAutofocusLabel, l.mParameters.currentAfTriggerId);
13522b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
13532b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        triggerId = ++l.mParameters.afTriggerCounter;
135595069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala
135695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // When using triggerAfWithAuto quirk, may need to reset focus mode to
1357ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // the real state at this point. No need to cancel explicitly if
1358ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala        // changing the AF mode.
135995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        if (l.mParameters.shadowFocusMode != Parameters::FOCUS_MODE_INVALID) {
136095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            ALOGV("%s: Quirk: Restoring focus mode to %d", __FUNCTION__,
136195069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala                    l.mParameters.shadowFocusMode);
136295069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.focusMode = l.mParameters.shadowFocusMode;
136395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            l.mParameters.shadowFocusMode = Parameters::FOCUS_MODE_INVALID;
136495069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala            updateRequests(l.mParameters);
1365ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala
1366ac0cd56627b121081308213d5a327cfbae410f4dEino-Ville Talvala            return OK;
136795069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        }
1368c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala        if (l.mParameters.allowZslMode) {
1369dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh            mZslProcessor->clearZslQueue();
1370dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh        }
1371174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
13724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
1373174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1374174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    mDevice->triggerCancelAutofocus(triggerId);
1375174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
13766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
137761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
137861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1379ff82370c7c04340d50673d425f48acafd00f2bc9Ben Murdochstatus_t Camera2Client::takePicture(int msgType) {
1380a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
138144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1382d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
13833a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1384d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
13852b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int takePictureCounter;
1386b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala    {
1387b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        SharedParameters::Lock l(mParameters);
1388b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        switch (l.mParameters.state) {
1389b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::DISCONNECTED:
1390b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STOPPED:
1391b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::WAITING_FOR_PREVIEW_WINDOW:
1392b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
1393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                        __FUNCTION__, mCameraId);
1394b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1395b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::PREVIEW:
1396b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for takePicture
1397b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                res = commandStopFaceDetectionL(l.mParameters);
1398b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                if (res != OK) {
1399b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    ALOGE("%s: Camera %d: Unable to stop face detection for still capture",
1400b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                            __FUNCTION__, mCameraId);
1401b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    return res;
1402b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                }
1403b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::STILL_CAPTURE;
1404092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh
1405092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                // Remove recording stream to prevent video snapshot jpeg logic kicking in
1406092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                if (l.mParameters.isJpegSizeOverridden() &&
1407092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
1408092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mStreamingProcessor->togglePauseStream(/*pause*/true);
1409092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1410092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
1411092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1412092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1413092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mDevice->waitUntilDrained();
1414092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1415092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
1416092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1417092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1418092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    // Clean up recording stream
1419092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mStreamingProcessor->deleteRecordingStream();
1420092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1421092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Unable to delete recording stream before "
1422092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                "stop preview: %s (%d)",
1423092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1424092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1425092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    res = mStreamingProcessor->togglePauseStream(/*pause*/false);
1426092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    if (res != OK) {
1427092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                        ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
1428092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                                __FUNCTION__, mCameraId, strerror(-res), res);
1429092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    }
1430092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                    l.mParameters.recoverOverriddenJpegSize();
1431092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh                }
1432b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1433b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::RECORD:
1434b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                // Good to go for video snapshot
1435b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                l.mParameters.state = Parameters::VIDEO_SNAPSHOT;
1436b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                break;
1437b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::STILL_CAPTURE:
1438b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
1439b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                ALOGE("%s: Camera %d: Already taking a picture",
1440b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                        __FUNCTION__, mCameraId);
1441b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                return INVALID_OPERATION;
1442b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
1443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1444b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        ALOGV("%s: Camera %d: Starting picture capture", __FUNCTION__, mCameraId);
1445e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        int lastJpegStreamId = mJpegProcessor->getStreamId();
1446355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        // slowJpegMode will create jpeg stream in CaptureSequencer before capturing
1447355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        if (!l.mParameters.slowJpegMode) {
1448355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            res = updateProcessorStream(mJpegProcessor, l.mParameters);
1449355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
1450355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
1451d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        // If video snapshot fail to configureStream, try override video snapshot size to
1452d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        // video size
1453d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        if (res == BAD_VALUE && l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
1454d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh            overrideVideoSnapshotSize(l.mParameters);
1455d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh            res = updateProcessorStream(mJpegProcessor, l.mParameters);
1456d3c5b081863ad5930971d90aee2f3a61f8424d88Yin-Chia Yeh        }
1457b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        if (res != OK) {
1458b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
1459b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1460b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala            return res;
1461b8d6efba8b87e6eeb049651cb67f9827198e658eEino-Ville Talvala        }
14622b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        takePictureCounter = ++l.mParameters.takePictureCounter;
1463e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He
1464e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        // Clear ZSL buffer queue when Jpeg size is changed.
1465e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId;
1466c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala        if (l.mParameters.allowZslMode && jpegStreamChanged) {
1467e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed",
1468e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He                    __FUNCTION__, mCameraId);
1469e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He            mZslProcessor->clearZslQueue();
1470e2d83756cb088db15fda73616ca097b8d190e1a1Zhijun He        }
1471228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
14728ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
14732b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    ATRACE_ASYNC_BEGIN(kTakepictureLabel, takePictureCounter);
14742b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
14754865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    // Need HAL to have correct settings before (possibly) triggering precapture
14764865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    syncWithDevice();
14774865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
1478aa9e3e01b86bd9bfb5ac36c0f360d5fe478cbb2dIgor Murashkin    res = mCaptureSequencer->startCapture(msgType);
1479d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
1480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to start capture: %s (%d)",
1481d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1482d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return res;
148561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
148661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
148761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
1488a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
14898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
149044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
14916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
14923a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
14933a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala
14942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
14956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1496dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    Parameters::focusMode_t focusModeBefore = l.mParameters.focusMode;
14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = l.mParameters.set(params);
14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
1499dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    Parameters::focusMode_t focusModeAfter = l.mParameters.focusMode;
1500dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh
1501c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    if (l.mParameters.allowZslMode && focusModeAfter != focusModeBefore) {
1502dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh        mZslProcessor->clearZslQueue();
1503dec84fb1c687509c3125acac76e0af80e4e0afbdYin-Chia Yeh    }
15049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
15068ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
15078ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
150861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
151061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1511a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
15128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
151344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
1514ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin    // The camera service can unconditionally get the parameters at all times
1515ebe865b175b3f1b2a9212cea7b008937c919d8f3Igor Murashkin    if (getCallingPid() != mServicePid && checkPid(__FUNCTION__) != OK) return String8();
1516ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::ReadLock l(mParameters);
1518ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
15198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return l.mParameters.get();
152061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
152161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
152261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1523a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
152444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Mutex::Autolock icl(mBinderSerializationLock);
15253a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    status_t res;
15263a609147811105d40766f8f8f5904bf71cb123cbEino-Ville Talvala    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
1527c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1528c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1529c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1530c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
153136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    switch (cmd) {
153236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_SMOOTH_ZOOM:
153336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartSmoothZoomL();
153436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_STOP_SMOOTH_ZOOM:
153536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStopSmoothZoomL();
153636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_DISPLAY_ORIENTATION:
153736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandSetDisplayOrientationL(arg1);
153836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_SHUTTER_SOUND:
153936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableShutterSoundL(arg1 == 1);
154036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PLAY_RECORDING_SOUND:
154136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPlayRecordingSoundL();
154236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_START_FACE_DETECTION:
154336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandStartFaceDetectionL(arg1);
1544228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case CAMERA_CMD_STOP_FACE_DETECTION: {
15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            SharedParameters::Lock l(mParameters);
15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return commandStopFaceDetectionL(l.mParameters);
1547228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
154836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
154936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandEnableFocusMoveMsgL(arg1 == 1);
155036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_PING:
155136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return commandPingL();
155236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_BUFFER_COUNT:
1553d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala        case CAMERA_CMD_SET_VIDEO_FORMAT:
15548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            ALOGE("%s: command %d (arguments %d, %d) is not supported.",
15558cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                    __FUNCTION__, cmd, arg1, arg2);
15568cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            return BAD_VALUE;
155736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        default:
155836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("%s: Unknown command %d (arguments %d, %d)",
155936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    __FUNCTION__, cmd, arg1, arg2);
1560c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
156136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
156236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
156336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
156436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStartSmoothZoomL() {
156536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
156636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
156736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
156836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
156936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandStopSmoothZoomL() {
157036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    ALOGE("%s: Unimplemented!", __FUNCTION__);
157136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
157236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
157336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
157436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandSetDisplayOrientationL(int degrees) {
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int transform = Parameters::degToTransform(degrees,
157636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
157736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (transform == -1) {
157836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        ALOGE("%s: Camera %d: Error setting %d as display orientation value",
157936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                __FUNCTION__, mCameraId, degrees);
158036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return BAD_VALUE;
158136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
15832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (transform != l.mParameters.previewTransform &&
158473bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala            getPreviewStreamId() != NO_STREAM) {
158573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        mDevice->setStreamTransform(getPreviewStreamId(), transform);
158636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.previewTransform = transform;
158836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
158936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
159036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
159136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableShutterSoundL(bool enable) {
15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
159336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (enable) {
15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        l.mParameters.playShutterSound = true;
1595c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
159636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1597983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
1598a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    // the camera2 api legacy mode can unconditionally disable the shutter sound
1599a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    if (mLegacyMode) {
1600a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        ALOGV("%s: Disable shutter sound in legacy mode", __FUNCTION__);
1601a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        l.mParameters.playShutterSound = false;
1602a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin        return OK;
1603a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin    }
1604a858ea0495c887621a2fd9c0afc13780deccb597Igor Murashkin
160536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Disabling shutter sound may not be allowed. In that case only
160636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // allow the mediaserver process to disable the sound.
160736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    char value[PROPERTY_VALUE_MAX];
160836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    property_get("ro.camera.sound.forced", value, "0");
160936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    if (strncmp(value, "0", 2) != 0) {
161036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // Disabling shutter sound is not allowed. Deny if the current
161136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        // process is not mediaserver.
161236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        if (getCallingPid() != getpid()) {
161336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            ALOGE("Failed to disable shutter sound. Permission denied (pid %d)",
161436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala                    getCallingPid());
161536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala            return PERMISSION_DENIED;
1616983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        }
161736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
1618983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.playShutterSound = false;
162036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
162136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
1622983cf231ab2d176a14595cdae46ff1b0c239af47James Dong
162336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPlayRecordingSoundL() {
162482104ebbb2cc04277ab07b355f38f73045a11770Chien-Yu Chen    mCameraService->playSound(CameraService::SOUND_RECORDING_START);
162536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
162636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
162736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1628ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinstatus_t Camera2Client::commandStartFaceDetectionL(int /*type*/) {
16298ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Starting face detection",
16308ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
16318ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch (l.mParameters.state) {
16342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::DISCONNECTED:
16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STOPPED:
16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
16372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
16388ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot start face detection without preview active",
16398ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId);
16408ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return INVALID_OPERATION;
16412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::PREVIEW:
16422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::RECORD:
16432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
16448ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            // Good to go for starting face detect
16458ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            break;
16468ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16478ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    // Ignoring type
16482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.fastInfo.bestFaceDetectMode ==
1649d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
16508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Face detection not supported",
16518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId);
1652caf3a9c1447f602c658f558025b90413d1b4114dZiv Hendel        return BAD_VALUE;
16538ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.enableFaceDetect) return OK;
16558ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFaceDetect = true;
16578ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = updateRequests(l.mParameters);
16598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16608ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
166136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
166236cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1663228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalastatus_t Camera2Client::commandStopFaceDetectionL(Parameters &params) {
16648ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res = OK;
16658ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    ALOGV("%s: Camera %d: Stopping face detection",
16668ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala          __FUNCTION__, mCameraId);
16678ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1668228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    if (!params.enableFaceDetect) return OK;
16698ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
1670228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    params.enableFaceDetect = false;
16718ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW
16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::RECORD
16742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            || params.state == Parameters::VIDEO_SNAPSHOT) {
1675228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        res = updateRequests(params);
16768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
16778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
16788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
167936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
168036cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
168136cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandEnableFocusMoveMsgL(bool enable) {
16822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
16832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    l.mParameters.enableFocusMoveMessages = enable;
1684174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
168536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    return OK;
168636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
168736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
168836cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvalastatus_t Camera2Client::commandPingL() {
168936cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    // Always ping back if access is proper and device is alive
16902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    SharedParameters::Lock l(mParameters);
16912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (l.mParameters.state != Parameters::DISCONNECTED) {
1692983cf231ab2d176a14595cdae46ff1b0c239af47James Dong        return OK;
169336cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    } else {
169436cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala        return NO_INIT;
169536cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala    }
169636cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala}
169736cdfb185877a7f573621d19ed2b2e1cac13d62eEino-Ville Talvala
1698d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalavoid Camera2Client::notifyError(int32_t errorCode,
1699a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk        const CaptureResultExtras& resultExtras) {
1700a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk    int32_t err = CAMERA_ERROR_UNKNOWN;
1701a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk    switch(errorCode) {
1702d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISCONNECTED:
1703a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            err = CAMERA_ERROR_RELEASED;
1704a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            break;
1705d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE:
1706a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            err = CAMERA_ERROR_UNKNOWN;
1707a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            break;
1708d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE:
1709a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            err = CAMERA_ERROR_SERVER_DIED;
1710a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            break;
1711d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST:
1712d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT:
1713d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER:
1714a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            ALOGW("%s: Received recoverable error %d from HAL - ignoring, requestId %" PRId32,
1715a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk                    __FUNCTION__, errorCode, resultExtras.requestId);
1716a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            return;
1717a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk        default:
1718a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            err = CAMERA_ERROR_UNKNOWN;
1719a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk            break;
1720a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk    }
1721a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk
1722a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk    ALOGE("%s: Error condition %d reported by HAL, requestId %" PRId32, __FUNCTION__, errorCode,
1723a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk              resultExtras.requestId);
1724a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk
1725a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk    SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
1726a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk    if (l.mRemoteCallback != nullptr) {
1727a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk        l.mRemoteCallback->notifyCallback(CAMERA_MSG_ERROR, err, 0);
1728a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk    }
1729a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk}
1730a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk
1731a485dfec4ad98283b911cf983566b0ce947343b6Ruben Brunk
17323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
1733160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) {
1734160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autofocus state now %d, last trigger %d",
1735160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1736174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendCompletedMessage = false;
1737174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool sendMovingMessage = false;
1738174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala
1739174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool success = false;
1740174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    bool afInMotion = false;
1741174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    {
17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        SharedParameters::Lock l(mParameters);
17432b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace end of AF state
17442b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        char tmp[32];
17452b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (l.mParameters.afStateCounter > 0) {
17462b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            camera_metadata_enum_snprint(
17472b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala                ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
17482b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(tmp, l.mParameters.afStateCounter);
17492b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
17502b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17512b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Update state
1752d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        l.mParameters.focusState = newState;
17532b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        l.mParameters.afStateCounter++;
17542b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17552b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        // Trace start of AF state
17562b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17572b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        camera_metadata_enum_snprint(
17582b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ANDROID_CONTROL_AF_STATE, l.mParameters.focusState, tmp, sizeof(tmp));
17592b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_BEGIN(tmp, l.mParameters.afStateCounter);
17602b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
17612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (l.mParameters.focusMode) {
1762174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_AUTO:
1763174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_MACRO:
1764174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // Don't send notifications upstream if they're not for the current AF
1765174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // trigger. For example, if cancel was called in between, or if we
1766174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                // already sent a notification about this AF call.
17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (triggerId != l.mParameters.currentAfTriggerId) break;
1768174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1769174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1770174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1771174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1772174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1773174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1775174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1776174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN:
1777174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Just starting focusing, ignore
1778174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1779174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1780174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1781174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
17824ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1783174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    default:
1784174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Unexpected in AUTO/MACRO mode
1785174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        ALOGE("%s: Unexpected AF state transition in AUTO/MACRO mode: %d",
1786174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                                __FUNCTION__, newState);
1787174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1788174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1789174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1790174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1791174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1792174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                switch (newState) {
1793174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED:
1794174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        success = true;
1795174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1796174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:
1797174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Don't send notifications upstream if they're not for
1798174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // the current AF trigger. For example, if cancel was
1799174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // called in between, or if we already sent a
1800174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // notification about this AF call.
1801174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Send both a 'AF done' callback and a 'AF move' callback
18022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (triggerId != l.mParameters.currentAfTriggerId) break;
1803174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        sendCompletedMessage = true;
1804174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
18052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
18062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1807174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1808174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
18092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        l.mParameters.currentAfTriggerId = -1;
1810174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1811174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_INACTIVE:
1812174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Cancel was called, or we switched state; care if
1813174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // currently moving
1814174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = false;
18152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages &&
18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                l.mParameters.afInMotion) {
1817174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1818174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1819174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1820174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN:
1821174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Start passive scan, inform upstream
1822174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        afInMotion = true;
1823174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // no break
1824174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED:
18254ad28ea0a76c7ecdfcc5b96af2b0afcb0c3e5120Eino-Ville Talvala                    case ANDROID_CONTROL_AF_STATE_PASSIVE_UNFOCUSED:
1826174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        // Stop passive scan, inform upstream
18272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        if (l.mParameters.enableFocusMoveMessages) {
1828174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                            sendMovingMessage = true;
1829174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        }
1830174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                        break;
1831174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
18322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                l.mParameters.afInMotion = afInMotion;
1833174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                break;
1834174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_EDOF:
1835174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_INFINITY:
1836174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            case Parameters::FOCUS_MODE_FIXED:
1837174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala            default:
1838174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                if (newState != ANDROID_CONTROL_AF_STATE_INACTIVE) {
1839a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    ALOGE("%s: Unexpected AF state change %d "
1840a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            "(ID %d) in focus mode %d",
1841a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                          __FUNCTION__, newState, triggerId,
1842a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                            l.mParameters.focusMode);
1843174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala                }
1844174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala        }
1845174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1846174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    if (sendMovingMessage) {
184744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
184844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
184944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS_MOVE,
18508ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    afInMotion ? 1 : 0, 0);
18518ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1852174181eec57c963a2a17bd156d81c3f18b3ba75cEino-Ville Talvala    }
1853603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    if (sendCompletedMessage) {
18542b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_END(kAutofocusLabel, triggerId);
185544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        SharedCameraCallbacks::Lock l(mSharedCameraCallbacks);
185644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        if (l.mRemoteCallback != 0) {
185744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_FOCUS,
1858a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala                    success ? 1 : 0, 0);
18598ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
1860603b12efa16e7afb4e6c75f6b353216c83e8e135Eino-Ville Talvala    }
1861160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1862160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1863160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvalavoid Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {
1864160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala    ALOGV("%s: Autoexposure state now %d, last trigger %d",
1865160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala            __FUNCTION__, newState, triggerId);
1866da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureSequencer->notifyAutoExposure(newState, triggerId);
1867160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala}
1868160d4af9d933fe9461bb213e5876fc5c8c2178c2Eino-Ville Talvala
1869216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yehvoid Camera2Client::notifyShutter(const CaptureResultExtras& resultExtras,
1870216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh                                  nsecs_t timestamp) {
1871216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    (void)resultExtras;
1872216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    (void)timestamp;
1873216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
1874216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    ALOGV("%s: Shutter notification for request id %" PRId32 " at time %" PRId64,
1875216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            __FUNCTION__, resultExtras.requestId, timestamp);
1876216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    mCaptureSequencer->notifyShutter(resultExtras, timestamp);
1877412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala
1878412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala    Camera2ClientBase::notifyShutter(resultExtras, timestamp);
1879216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh}
1880216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
1881a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvalacamera2::SharedParameters& Camera2Client::getParameters() {
1882a16733eeb9c40db4793bec408f29b4204e5f23b1Eino-Ville Talvala    return mParameters;
1883c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala}
1884c8474b68e435cd840ba66791fb09e3da59f1d93cEino-Ville Talvala
1885da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getPreviewStreamId() const {
188673bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getPreviewStreamId();
1887da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1888da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1889da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCaptureStreamId() const {
1890da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mJpegProcessor->getStreamId();
1891da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1892da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1893da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getCallbackStreamId() const {
1894da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mCallbackProcessor->getStreamId();
1895da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1896da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1897da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getRecordingStreamId() const {
189873bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    return mStreamingProcessor->getRecordingStreamId();
1899da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1900da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1901da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaint Camera2Client::getZslStreamId() const {
1902da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return mZslProcessor->getStreamId();
1903da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1904da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
19054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::registerFrameListener(int32_t minId, int32_t maxId,
19068b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh        const wp<camera2::FrameProcessor::FilteredListener>& listener, bool sendPartials) {
190725a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    return mFrameProcessor->registerListener(minId, maxId, listener, sendPartials);
19084865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
19094865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
19104865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::removeFrameListener(int32_t minId, int32_t maxId,
19118b0b971b1416738f22488a80be726d1ec12552a8Chih-Hung Hsieh        const wp<camera2::FrameProcessor::FilteredListener>& listener) {
19124865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mFrameProcessor->removeListener(minId, maxId, listener);
1913da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1914da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
19154865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::stopStream() {
19164865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return mStreamingProcessor->stopStream();
1917da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
1918da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1919355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yehstatus_t Camera2Client::createJpegStreamL(Parameters &params) {
1920355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    status_t res = OK;
1921355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    int lastJpegStreamId = mJpegProcessor->getStreamId();
1922355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (lastJpegStreamId != NO_STREAM) {
1923355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        return INVALID_OPERATION;
1924355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
1925355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
1926355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    res = mStreamingProcessor->togglePauseStream(/*pause*/true);
1927355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (res != OK) {
1928355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
1929355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                __FUNCTION__, mCameraId, strerror(-res), res);
1930355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        return res;
1931355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
1932355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
1933355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    res = mDevice->flush();
1934355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (res != OK) {
1935355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        ALOGE("%s: Camera %d: Unable flush device: %s (%d)",
1936355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                __FUNCTION__, mCameraId, strerror(-res), res);
1937355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        return res;
1938355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
1939355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
1940355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    // Ideally we don't need this, but current camera device
1941355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    // status tracking mechanism demands it.
1942355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    res = mDevice->waitUntilDrained();
1943355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (res != OK) {
1944355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        ALOGE("%s: Camera %d: Waiting device drain failed: %s (%d)",
1945355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                __FUNCTION__, mCameraId, strerror(-res), res);
1946355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
1947355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
1948355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    res = updateProcessorStream(mJpegProcessor, params);
1949355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    return res;
1950355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh}
1951355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
19524865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdStart;
19534865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kPreviewRequestIdEnd;
19544865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdStart;
19554865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kRecordingRequestIdEnd;
19564865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdStart;
19574865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalaconst int32_t Camera2Client::kCaptureRequestIdEnd;
1958da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
19593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
19603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19615a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvalastatus_t Camera2Client::updateRequests(Parameters &params) {
19628ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    status_t res;
19638ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
196422d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin    ALOGV("%s: Camera %d: state = %d", __FUNCTION__, getCameraId(), params.state);
196522d58d37db6b5f48a10b3a19f69ffda09943c125Igor Murashkin
19664865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mStreamingProcessor->incrementStreamingIds();
19674865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res != OK) {
19684865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to increment request IDs: %s (%d)",
19694865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19704865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        return res;
19714865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
19724865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
197373bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updatePreviewRequest(params);
19748ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
19758ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
19768ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19778ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
19788ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
197973bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala    res = mStreamingProcessor->updateRecordingRequest(params);
19808ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    if (res != OK) {
19818ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
19828ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
19838ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        return res;
19848ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
19858ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
19862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (params.state == Parameters::PREVIEW) {
19875a4f93eaaab7518fd734fdc9f0f686d632f31a59Eino-Ville Talvala        res = startPreviewL(params, true);
19888ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
19898ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
19908ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
19918ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
19928ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
19932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (params.state == Parameters::RECORD ||
19942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.state == Parameters::VIDEO_SNAPSHOT) {
199573bbd1f1c493835f191ea2b0b72439292496b40aEino-Ville Talvala        res = startRecordingL(params, true);
19968ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        if (res != OK) {
19978ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
19988ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
19998ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala            return res;
20008ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala        }
20018ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    }
20028ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala    return res;
20038ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala}
20048ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
20059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2006228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvalasize_t Camera2Client::calculateBufferSize(int width, int height,
2007228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        int format, int stride) {
2008228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    switch (format) {
2009228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
2010228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2011228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
2012228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 3 / 2;
2013228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
2014228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2015228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12: {      // YV12
2016228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t ySize = stride * height;
2017f17b6cf6aa7548ca82e7fed96d71db7821103e57Eino-Ville Talvala            size_t uvStride = (stride / 2 + 0xF) & ~0xF;
2018228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            size_t uvSize = uvStride * height / 2;
2019228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return ySize + uvSize * 2;
2020228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        }
2021228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:
2022228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2023228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:
2024228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 4;
2025a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
2026228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return width * height * 2;
2027228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala        default:
2028228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
2029228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala                    __FUNCTION__,  format);
2030228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala            return 0;
2031228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala    }
2032228a53805808a24cb19fcf13b1f0bdc2ed89bbe1Eino-Ville Talvala}
20338ce89d9e2b132bf58a030acec88acf0a998926a1Eino-Ville Talvala
20344865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvalastatus_t Camera2Client::syncWithDevice() {
20354865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    ATRACE_CALL();
203643b7ac6bd1a949ecb8ffc7e50d0a2f01a6258034Eino-Ville Talvala    const nsecs_t kMaxSyncTimeout = 500000000; // 500 ms
20374865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    status_t res;
20384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
20394865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    int32_t activeRequestId = mStreamingProcessor->getActiveRequestId();
20404865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (activeRequestId == 0) return OK;
20414865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
20424865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    res = mDevice->waitUntilRequestReceived(activeRequestId, kMaxSyncTimeout);
20434865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (res == TIMED_OUT) {
20444865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Timed out waiting sync with HAL",
20454865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
20464865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    } else if (res != OK) {
20474865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        ALOGE("%s: Camera %d: Error while waiting to sync with HAL",
20484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala                __FUNCTION__, mCameraId);
20494865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
20504865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    return res;
20514865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala}
20524865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala
2053dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkintemplate <typename ProcessorT>
2054dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
2055dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                                              camera2::Parameters params) {
205682db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // No default template arguments until C++11, so we need this overload
205782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
205882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin            processor, params);
205982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin}
206082db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin
206182db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkintemplate <typename ProcessorT,
206282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin          status_t (ProcessorT::*updateStreamF)(const Parameters &)>
206382db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkinstatus_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
206482db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin                                              Parameters params) {
2065dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    status_t res;
2066dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
206782db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    // Get raw pointer since sp<T> doesn't have operator->*
206882db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    ProcessorT *processorPtr = processor.get();
206982db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin    res = (processorPtr->*updateStreamF)(params);
2070dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2071dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    /**
2072dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Can't update the stream if it's busy?
2073dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     *
2074dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * Then we need to stop the device (by temporarily clearing the request
2075dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     * queue) and then try again. Resume streaming once we're done.
2076dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin     */
2077dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    if (res == -EBUSY) {
2078a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala        ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__,
2079a691ff3c03e38e148bbefed35ebb15e552a12613Eino-Ville Talvala                mCameraId);
2080dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/true);
2081dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2082dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
2083dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
2084dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2085dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2086dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mDevice->waitUntilDrained();
2087dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2088dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Waiting to stop streaming failed: %s (%d)",
2089dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
2090dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2091dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
209282db9e6126812dd2ee74e33e4c475cae2c7e48f6Igor Murashkin        res = (processorPtr->*updateStreamF)(params);
2093dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2094dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Failed to update processing stream "
2095dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  " despite having halted streaming first: %s (%d)",
2096dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                  __FUNCTION__, mCameraId, strerror(-res), res);
2097dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2098dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2099dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        res = mStreamingProcessor->togglePauseStream(/*pause*/false);
2100dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        if (res != OK) {
2101dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin            ALOGE("%s: Camera %d: Can't unpause streaming: %s (%d)",
2102dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin                    __FUNCTION__, mCameraId, strerror(-res), res);
2103dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin        }
2104dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    }
2105dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin
2106dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin    return res;
2107dca254aef0c09867e50fe6613c6fad405de72842Igor Murashkin}
210844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
2109a53021f776d0c82271727e5817388936513feb92Yin-Chia Yehstatus_t Camera2Client::overrideVideoSnapshotSize(Parameters &params) {
2110a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    ALOGV("%s: Camera %d: configure still size to video size before recording"
2111a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh            , __FUNCTION__, mCameraId);
2112a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    params.overrideJpegSizeByVideoSize();
2113a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    status_t res = updateProcessorStream(mJpegProcessor, params);
2114a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    if (res != OK) {
2115a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh        ALOGE("%s: Camera %d: Can't override video snapshot size to video size: %s (%d)",
2116a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh                __FUNCTION__, mCameraId, strerror(-res), res);
2117a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    }
2118a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh    return res;
2119a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh}
2120a53021f776d0c82271727e5817388936513feb92Yin-Chia Yeh
21218cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenstatus_t Camera2Client::setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer) {
21228cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    ATRACE_CALL();
21238cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    ALOGV("%s: E", __FUNCTION__);
21248cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    Mutex::Autolock icl(mBinderSerializationLock);
21258cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    status_t res;
21268cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;
21278cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21288cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    sp<IBinder> binder = IInterface::asBinder(bufferProducer);
21298cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (binder == mVideoSurface) {
21308cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGV("%s: Camera %d: New video window is same as old video window",
21318cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                __FUNCTION__, mCameraId);
21328cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        return NO_ERROR;
21338cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
21348cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21358cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    sp<Surface> window;
21368cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    int format;
21378cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    android_dataspace dataSpace;
21388cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21398cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (bufferProducer != nullptr) {
21408cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        // Using controlledByApp flag to ensure that the buffer queue remains in
21418cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        // async mode for the old camera API, where many applications depend
21428cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        // on that behavior.
21438cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        window = new Surface(bufferProducer, /*controlledByApp*/ true);
21448cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21458cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ANativeWindow *anw = window.get();
21468cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21478cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        if ((res = anw->query(anw, NATIVE_WINDOW_FORMAT, &format)) != OK) {
21488cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            ALOGE("%s: Failed to query Surface format", __FUNCTION__);
21498cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            return res;
21508cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        }
21518cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21528cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        if ((res = anw->query(anw, NATIVE_WINDOW_DEFAULT_DATASPACE,
21538cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                                reinterpret_cast<int*>(&dataSpace))) != OK) {
21548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            ALOGE("%s: Failed to query Surface dataSpace", __FUNCTION__);
21558cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            return res;
21568cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        }
21578cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
21588cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21598cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    Parameters::State state;
21608cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    {
21618cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        SharedParameters::Lock l(mParameters);
21628cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        state = l.mParameters.state;
21638cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
21648cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21658cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    switch (state) {
21668cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        case Parameters::STOPPED:
21678cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
21688cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        case Parameters::PREVIEW:
21698cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // OK
21708cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            break;
21718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        case Parameters::DISCONNECTED:
21728cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        case Parameters::RECORD:
21738cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        case Parameters::STILL_CAPTURE:
21748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        case Parameters::VIDEO_SNAPSHOT:
21758cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        default:
21768cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            ALOGE("%s: Camera %d: Cannot set video target while in state %s",
21778cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                    __FUNCTION__, mCameraId,
21788cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                    Parameters::getStateName(state));
21798cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            return INVALID_OPERATION;
21808cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
21818cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21828cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    mVideoSurface = binder;
21838cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    res = mStreamingProcessor->setRecordingWindow(window);
21848cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    if (res != OK) {
21858cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        ALOGE("%s: Unable to set new recording window: %s (%d)",
21868cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen                __FUNCTION__, strerror(-res), res);
21878cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        return res;
21888cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
21898cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21908cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    {
21918cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        SharedParameters::Lock l(mParameters);
21928cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        l.mParameters.videoFormat = format;
21938cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen        l.mParameters.videoDataSpace = dataSpace;
21948cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    }
21958cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21968cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    return OK;
21978cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen}
21988cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
21992b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kAutofocusLabel = "autofocus";
22002b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvalaconst char* Camera2Client::kTakepictureLabel = "take_picture";
22012b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
220261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
2203