CaptureSequencer.cpp revision 6b367f2a2bddfed60d63fa4da5e19ca13352a454
1da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/*
2da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
3da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *
4da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * you may not use this file except in compliance with the License.
6da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * You may obtain a copy of the License at
7da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *
8da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala *
10da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * See the License for the specific language governing permissions and
14da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala * limitations under the License.
15da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala */
16da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
17da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define LOG_TAG "Camera2Client::CaptureSequencer"
18da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
19da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala//#define LOG_NDEBUG 0
20da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Log.h>
22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Trace.h>
23da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Vector.h>
24da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "CaptureSequencer.h"
26e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter#include "BurstCapture.h"
27da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "../Camera2Device.h"
28da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "../Camera2Client.h"
29da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include "Parameters.h"
30da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
31da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace android {
32da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalanamespace camera2 {
33da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
34da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** Public members */
35da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
36da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client):
37da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        Thread(false),
38da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mStartCapture(false),
39da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mBusy(false),
40da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewAEState(false),
41da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewFrameReceived(false),
42da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewCaptureReceived(false),
43da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mClient(client),
44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mCaptureState(IDLE),
45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mTriggerId(0),
46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mTimeoutCount(0),
47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mCaptureId(Camera2Client::kFirstCaptureRequestId) {
48e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
49da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() {
52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) {
56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor = processor;
58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() {
61e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
62da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mBusy) {
65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Already busy capturing!", __FUNCTION__);
66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return INVALID_OPERATION;
67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mStartCapture) {
69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mStartCapture = true;
70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mStartCaptureSignal.signal();
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) {
76da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
77da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
78da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mAEState = newState;
79da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mAETriggerId = triggerId;
80da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mNewAEState) {
81da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewAEState = true;
82da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewNotifySignal.signal();
83da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
84da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
85da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
86da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId,
87da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        CameraMetadata &frame) {
88e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s: Listener found new frame", __FUNCTION__);
89da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
90da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
91da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mNewFrameId = frameId;
92da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mNewFrame.acquire(frame);
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mNewFrameReceived) {
94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewFrameReceived = true;
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewFrameSignal.signal();
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
99fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp,
100fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        sp<MemoryBase> captureBuffer) {
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
102e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureTimestamp = timestamp;
105fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    mCaptureBuffer = captureBuffer;
106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mNewCaptureReceived) {
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewCaptureReceived = true;
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewCaptureSignal.signal();
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
110da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) {
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 result;
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        result = "    Capture request:\n";
117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        write(fd, result.string(), result.size());
118da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
120da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        result = "    Capture request: undefined\n";
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        write(fd, result.string(), result.size());
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result = String8::format("    Current capture state: %s\n",
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            kStateNames[mCaptureState]);
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.append("    Latest captured frame:\n");
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    write(fd, result.string(), result.size());
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mNewFrame.dump(fd, 2, 6);
128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** Private members */
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] =
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala{
134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "IDLE",
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "START",
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ZSL_START",
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ZSL_WAITING",
138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ZSL_REPROCESSING",
139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "STANDARD_START",
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "STANDARD_PRECAPTURE",
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "STANDARD_CAPTURING",
142e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    "BURST_CAPTURE_START",
143e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    "BURST_CAPTURE_WAIT",
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "DONE",
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ERROR",
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "UNKNOWN"
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst CaptureSequencer::StateManager
150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageIdle,
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStart,
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageZslStart,
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageZslWaiting,
155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageZslReprocessing,
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardStart,
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardPrecaptureWait,
158da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardCapture,
159da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardCaptureWait,
160e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    &CaptureSequencer::manageBurstCaptureStart,
161e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    &CaptureSequencer::manageBurstCaptureWait,
162da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageDone,
163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CaptureSequencer::threadLoop() {
166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    sp<Camera2Client> client = mClient.promote();
169da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (client == 0) return false;
170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mCaptureState < ERROR) {
172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mCaptureState = (this->*kStateManagers[mCaptureState])(client);
173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Bad capture state: %s",
175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, kStateNames[mCaptureState]);
176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return false;
177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
179da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return true;
180da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) {
183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    while (!mStartCapture) {
187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mStartCaptureSignal.waitRelative(mInputMutex,
188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                kWaitDuration);
189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) break;
190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mStartCapture) {
192da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mStartCapture = false;
193da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mBusy = true;
194da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return START;
195da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
196da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return IDLE;
197da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
198da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
199da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) {
200fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    status_t res = OK;
201da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
202da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureId++;
203da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
204da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    {
205da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        Mutex::Autolock l(mInputMutex);
206da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mBusy = false;
207da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
208da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
209fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    {
210fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
211fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        switch (l.mParameters.state) {
212fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
213fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
214fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                break;
215fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
216fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
217fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                break;
218fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            default:
219fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                ALOGE("%s: Camera %d: Still image produced unexpectedly "
220fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                        "in state %s!",
221fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                        __FUNCTION__, client->getCameraId(),
222fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                        Parameters::getStateName(l.mParameters.state));
223fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                res = INVALID_OPERATION;
224fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        }
225fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    }
226768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
227768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    if (processor != 0) {
228768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala        processor->clearZslQueue();
229768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    }
230768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala
231fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    if (mCaptureBuffer != 0 && res == OK) {
232fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient);
233fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        ALOGV("%s: Sending still image to client", __FUNCTION__);
234fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        if (l.mCameraClient != 0) {
235fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
236fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                    mCaptureBuffer, NULL);
237fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        } else {
238fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            ALOGV("%s: No client!", __FUNCTION__);
239fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        }
240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
241fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    mCaptureBuffer.clear();
242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return IDLE;
244da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
245da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
246da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart(
247da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
248e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
249da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
250da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
251da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
252da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState nextState = DONE;
253da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
254da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = updateCaptureRequest(l.mParameters, client);
255da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK ) {
256da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)",
257da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
258da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
259da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
260da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
261e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE &&
262e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            l.mParameters.state == Parameters::STILL_CAPTURE) {
263e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        nextState = BURST_CAPTURE_START;
264e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
265e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    else if (l.mParameters.zslMode &&
2666b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE &&
2676b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala            l.mParameters.flashMode != Parameters::FLASH_MODE_ON) {
268da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        nextState = ZSL_START;
269da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
270da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        nextState = STANDARD_START;
271da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
272da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
273da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return nextState;
274da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
275da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
276da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart(
277da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
278bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
279da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (processor == 0) {
282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: No ZSL queue to use!", __FUNCTION__);
283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    client->registerFrameListener(mCaptureId,
287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            this);
288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = client->getCameraDevice()->clearStreamingRequest();
290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: "
292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                "%s (%d)",
293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
296da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // TODO: Actually select the right thing here.
297bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    res = processor->pushToReprocess(mCaptureId);
298bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    if (res != OK) {
29997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala        if (res == NOT_ENOUGH_DATA) {
30097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala            ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, "
30197b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala                    "falling back to normal capture", __FUNCTION__,
30297b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala                    client->getCameraId());
30397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala        } else {
30497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala            ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)",
30597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
30697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala        }
307bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala        return STANDARD_START;
308bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    }
309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
310da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
311da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala    if (l.mParameters.playShutterSound) {
312da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
313da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala    }
314da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala
315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting(
320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
321bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
322da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return DONE;
323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing(
326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
327bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return START;
329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
331da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
334da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    client->registerFrameListener(mCaptureId,
335da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            this);
336da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    {
337da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
338da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mTriggerId = l.mParameters.precaptureTriggerCounter++;
339da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
340da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId);
341da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
342da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mAeInPrecapture = false;
343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForPrecaptureStart;
344da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
345da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
346da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
347da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait(
348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
351da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    while (!mNewAEState) {
353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration);
354da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) {
355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mTimeoutCount--;
356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
358da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
359da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mTimeoutCount <= 0) {
360da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGW("Timed out waiting for precapture %s",
361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                mAeInPrecapture ? "end" : "start");
362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return STANDARD_CAPTURE;
363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mNewAEState) {
365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (!mAeInPrecapture) {
366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            // Waiting to see PRECAPTURE state
367da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGV("%s: Got precapture start", __FUNCTION__);
370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                mAeInPrecapture = true;
371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                mTimeoutCount = kMaxTimeoutsForPrecaptureEnd;
372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            // Waiting to see PRECAPTURE state end
375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGV("%s: Got precapture end", __FUNCTION__);
378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                return STANDARD_CAPTURE;
379da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
380da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
381da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewAEState = false;
382da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
383da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
384da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Vector<uint8_t> outputStreams;
392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    outputStreams.push(client->getPreviewStreamId());
394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    outputStreams.push(client->getCaptureStreamId());
395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (l.mParameters.previewCallbackFlags &
397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(client->getCallbackStreamId());
399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(client->getRecordingStreamId());
403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            outputStreams);
407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res == OK) {
408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.update(ANDROID_REQUEST_ID,
409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                &mCaptureId, 1);
410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res == OK) {
412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.sort();
413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
418da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
422da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId());
425da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
426da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
427da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (l.mParameters.state == Parameters::STILL_CAPTURE) {
429da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = client->getCameraDevice()->clearStreamingRequest();
430da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
431da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    "%s (%d)",
433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return DONE;
435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = client->getCameraDevice()->capture(captureCopy);
439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                "%s (%d)",
442da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
444da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
445da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
446efb039e07c688c21122c938b008457bd4f555898Eino-Ville Talvala    if (l.mParameters.playShutterSound &&
447efb039e07c688c21122c938b008457bd4f555898Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE) {
448609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
449609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala    }
450609acc0c96bc2aedd42246862b537e045f5184b6Eino-Ville Talvala
451da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
452da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
453da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait(
456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    while (!mNewFrameReceived) {
461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration);
462da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) {
463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mTimeoutCount--;
464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
465da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
466da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
467da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    while (!mNewCaptureReceived) {
468da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
469da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) {
470da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mTimeoutCount--;
471da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
472da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
473da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mTimeoutCount <= 0) {
475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGW("Timed out waiting for capture to complete");
476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mNewFrameReceived && mNewCaptureReceived) {
479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (mNewFrameId != mCaptureId) {
480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGW("Mismatched capture frame IDs: Expected %d, got %d",
481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    mCaptureId, mNewFrameId);
482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        camera_metadata_entry_t entry;
484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP);
485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (entry.count == 0) {
486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("No timestamp field in capture frame!");
487da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (entry.data.i64[0] != mCaptureTimestamp) {
489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGW("Mismatched capture timestamps: Metadata frame %lld,"
490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp);
491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        client->removeFrameListener(mCaptureId);
493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
494da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewFrameReceived = false;
495da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewCaptureReceived = false;
496da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
497da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
498da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
499da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
500da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
501e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart(
502e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        sp<Camera2Client> &client) {
503e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
504e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    status_t res;
505e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ATRACE_CALL();
506e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
507e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    // check which burst mode is set, create respective burst object
508e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    {
509e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        SharedParameters::Lock l(client->getParameters());
510e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
511e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        res = updateCaptureRequest(l.mParameters, client);
512e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        if(res != OK) {
513e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            return DONE;
514e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        }
515e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
516e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        //
517e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        // check for burst mode type in mParameters here
518e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        //
519e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        mBurstCapture = new BurstCapture(client, this);
520e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
521e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
522e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1);
523e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (res == OK) {
524e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        res = mCaptureRequest.sort();
525e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
526e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (res != OK) {
527e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
528e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter                __FUNCTION__, client->getCameraId(), strerror(-res), res);
529e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
530e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
531e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
532e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CameraMetadata captureCopy = mCaptureRequest;
533e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (captureCopy.entryCount() == 0) {
534e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
535e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter                __FUNCTION__, client->getCameraId());
536e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
537e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
538e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
539e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    Vector<CameraMetadata> requests;
540e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    requests.push(mCaptureRequest);
541e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    res = mBurstCapture->start(requests, mCaptureId);
542e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10;
543e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return BURST_CAPTURE_WAIT;
544e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
545e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
546e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait(
547e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        sp<Camera2Client> &client) {
548e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    status_t res;
549e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ATRACE_CALL();
550e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
551e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    while (!mNewCaptureReceived) {
552e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
553e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        if (res == TIMED_OUT) {
554e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            mTimeoutCount--;
555e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            break;
556e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        }
557e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
558e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
559e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (mTimeoutCount <= 0) {
560e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGW("Timed out waiting for burst capture to complete");
561e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
562e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
563e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (mNewCaptureReceived) {
564e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        mNewCaptureReceived = false;
565e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        // TODO: update mCaptureId to last burst's capture ID + 1?
566e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
567e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
568e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
569e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return BURST_CAPTURE_WAIT;
570e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
571e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
572da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters &params,
573da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
574da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
575da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
576da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
577da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = client->getCameraDevice()->createDefaultRequest(
578da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                CAMERA2_TEMPLATE_STILL_CAPTURE,
579da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                &mCaptureRequest);
580da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
581da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
582da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, client->getCameraId(),
583da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    strerror(-res), res);
584da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
585da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
586da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
587da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
588da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = params.updateRequest(&mCaptureRequest);
589da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
590da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
591da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
592da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                strerror(-res), res);
593da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return res;
594da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
595da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
596da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE,
597da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            params.jpegThumbSize, 2);
598da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
599da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
600da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &params.jpegThumbQuality, 1);
601da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
602da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_QUALITY,
603da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &params.jpegQuality, 1);
604da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
605da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureRequest.update(
606da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
607da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &params.jpegRotation, 1);
608da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
609da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
610da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (params.gpsEnabled) {
611da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.update(
612da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
613da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                params.gpsCoordinates, 3);
614da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) return res;
615da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.update(
616da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
617da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                &params.gpsTimestamp, 1);
618da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) return res;
619da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.update(
620da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
621da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                params.gpsProcessingMethod);
622da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) return res;
623da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
624da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES);
625da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) return res;
626da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP);
627da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) return res;
628da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
629da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) return res;
630da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
631da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
632da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
633da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
634da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
635da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
636da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2
637da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android
638