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
174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-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),
431e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala        mShutterNotified(false),
44da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mClient(client),
45da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mCaptureState(IDLE),
46da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mTriggerId(0),
47da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mTimeoutCount(0),
484865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        mCaptureId(Camera2Client::kCaptureRequestIdStart) {
49e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
50da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
51da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
52da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() {
53da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
54da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
55da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
56da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) {
57da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
58da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mZslProcessor = processor;
59da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
60da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
61da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() {
62e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
63da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
64da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
65da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mBusy) {
66da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Already busy capturing!", __FUNCTION__);
67da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return INVALID_OPERATION;
68da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
69da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mStartCapture) {
70da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mStartCapture = true;
71da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mStartCaptureSignal.signal();
72da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
73da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
74da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
75da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
76d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) {
77d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    ATRACE_CALL();
78d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    ALOGV("%s: Waiting for idle", __FUNCTION__);
79d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Mutex::Autolock l(mStateMutex);
80d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    status_t res = -1;
81d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    while (mCaptureState != IDLE) {
82d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        nsecs_t startTime = systemTime();
83d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
84d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        res = mStateChanged.waitRelative(mStateMutex, timeout);
85d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        if (res != OK) return res;
86d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
87d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        timeout -= (systemTime() - startTime);
88d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    }
89d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    ALOGV("%s: Now idle", __FUNCTION__);
90d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    return OK;
91d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala}
92d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
93da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) {
94da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
95da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
96da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mAEState = newState;
97da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mAETriggerId = triggerId;
98da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mNewAEState) {
99da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewAEState = true;
100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewNotifySignal.signal();
101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId,
1054865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        const CameraMetadata &frame) {
106e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s: Listener found new frame", __FUNCTION__);
107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mNewFrameId = frameId;
1104865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    mNewFrame = frame;
111da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mNewFrameReceived) {
112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewFrameReceived = true;
113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewFrameSignal.signal();
114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
117fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp,
118fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        sp<MemoryBase> captureBuffer) {
119da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
120e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureTimestamp = timestamp;
123fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    mCaptureBuffer = captureBuffer;
124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (!mNewCaptureReceived) {
125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewCaptureReceived = true;
126da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewCaptureSignal.signal();
127da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) {
132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    String8 result;
133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
134da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        result = "    Capture request:\n";
135da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        write(fd, result.string(), result.size());
136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        result = "    Capture request: undefined\n";
139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        write(fd, result.string(), result.size());
140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result = String8::format("    Current capture state: %s\n",
142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            kStateNames[mCaptureState]);
143da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    result.append("    Latest captured frame:\n");
144da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    write(fd, result.string(), result.size());
145da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mNewFrame.dump(fd, 2, 6);
146da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
147da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
148da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala/** Private members */
149da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
150da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] =
151da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala{
152da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "IDLE",
153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "START",
154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ZSL_START",
155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ZSL_WAITING",
156da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ZSL_REPROCESSING",
157da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "STANDARD_START",
158d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    "STANDARD_PRECAPTURE_WAIT",
159d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    "STANDARD_CAPTURE",
160d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    "STANDARD_CAPTURE_WAIT",
161e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    "BURST_CAPTURE_START",
162e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    "BURST_CAPTURE_WAIT",
163da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "DONE",
164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "ERROR",
165da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    "UNKNOWN"
166da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalaconst CaptureSequencer::StateManager
169da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageIdle,
171da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStart,
172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageZslStart,
173da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageZslWaiting,
174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageZslReprocessing,
175da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardStart,
176da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardPrecaptureWait,
177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardCapture,
178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageStandardCaptureWait,
179e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    &CaptureSequencer::manageBurstCaptureStart,
180e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    &CaptureSequencer::manageBurstCaptureWait,
181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    &CaptureSequencer::manageDone,
182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala};
183da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalabool CaptureSequencer::threadLoop() {
185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    sp<Camera2Client> client = mClient.promote();
188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (client == 0) return false;
189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
190d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    CaptureState currentState;
191d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    {
192d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        Mutex::Autolock l(mStateMutex);
193d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        currentState = mCaptureState;
194d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    }
195d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
196d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    currentState = (this->*kStateManagers[currentState])(client);
197d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
198d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    Mutex::Autolock l(mStateMutex);
199d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    if (currentState != mCaptureState) {
200d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        mCaptureState = currentState;
201d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        ATRACE_INT("cam2_capt_state", mCaptureState);
202d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        ALOGV("Camera %d: New capture state %s",
203d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala                client->getCameraId(), kStateNames[mCaptureState]);
204d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        mStateChanged.signal();
205d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    }
206d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala
207d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala    if (mCaptureState == ERROR) {
208d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala        ALOGE("Camera %d: Stopping capture sequencer due to error",
209d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala                client->getCameraId());
210da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return false;
211da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
212da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
213da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return true;
214da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
215da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
216da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) {
217da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
218da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
219da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    while (!mStartCapture) {
220da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mStartCaptureSignal.waitRelative(mInputMutex,
221da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                kWaitDuration);
222da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) break;
223da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
224da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mStartCapture) {
225da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mStartCapture = false;
226da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mBusy = true;
227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return START;
228da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
229da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return IDLE;
230da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
231da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
232da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) {
233fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    status_t res = OK;
234da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
235da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mCaptureId++;
2364865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) {
2374865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        mCaptureId = Camera2Client::kCaptureRequestIdStart;
2384865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    }
239da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    {
240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        Mutex::Autolock l(mInputMutex);
241da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mBusy = false;
242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
244fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    {
245fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
246fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        switch (l.mParameters.state) {
247d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala            case Parameters::DISCONNECTED:
248d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala                ALOGW("%s: Camera %d: Discarding image data during shutdown ",
249d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala                        __FUNCTION__, client->getCameraId());
250d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala                res = INVALID_OPERATION;
251d5087f91357a9218580596b466926ab750bc8ea7Eino-Ville Talvala                break;
252fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
253fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
254fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                break;
255fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
256fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
257fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                break;
258fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            default:
259fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                ALOGE("%s: Camera %d: Still image produced unexpectedly "
260fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                        "in state %s!",
261fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                        __FUNCTION__, client->getCameraId(),
262fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                        Parameters::getStateName(l.mParameters.state));
263fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                res = INVALID_OPERATION;
264fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        }
265fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    }
266768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
267768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    if (processor != 0) {
268768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala        processor->clearZslQueue();
269768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala    }
270768cf093dade9085e0ad6305d9f7c16ae9ad9e26Eino-Ville Talvala
271fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    if (mCaptureBuffer != 0 && res == OK) {
272fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient);
273fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        ALOGV("%s: Sending still image to client", __FUNCTION__);
274fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        if (l.mCameraClient != 0) {
275fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
276fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala                    mCaptureBuffer, NULL);
277fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        } else {
278fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala            ALOGV("%s: No client!", __FUNCTION__);
279fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala        }
280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
281fe580e57081885dd6059e0d407a6cd96a1be7e51Eino-Ville Talvala    mCaptureBuffer.clear();
282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return IDLE;
284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
285da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart(
287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
288e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
291da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
292da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CaptureState nextState = DONE;
293da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
294da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = updateCaptureRequest(l.mParameters, client);
295da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK ) {
296da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)",
297da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
298da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
299da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
300da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
301e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE &&
302e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            l.mParameters.state == Parameters::STILL_CAPTURE) {
303e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        nextState = BURST_CAPTURE_START;
304e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
305e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    else if (l.mParameters.zslMode &&
3066b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE &&
3076b367f2a2bddfed60d63fa4da5e19ca13352a454Eino-Ville Talvala            l.mParameters.flashMode != Parameters::FLASH_MODE_ON) {
308da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        nextState = ZSL_START;
309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    } else {
310da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        nextState = STANDARD_START;
311da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
3121e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala    mShutterNotified = false;
313da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
314da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return nextState;
315da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
316da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart(
318da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
319bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
322da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (processor == 0) {
323da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: No ZSL queue to use!", __FUNCTION__);
324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
3274865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            this);
329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
330da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // TODO: Actually select the right thing here.
331bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    res = processor->pushToReprocess(mCaptureId);
332bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    if (res != OK) {
33397b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala        if (res == NOT_ENOUGH_DATA) {
33497b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala            ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, "
33597b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala                    "falling back to normal capture", __FUNCTION__,
33697b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala                    client->getCameraId());
33797b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala        } else {
33897b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala            ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)",
33997b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
34097b38a81ac989ccba02d726011a82541f14166dfEino-Ville Talvala        }
341bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala        return STANDARD_START;
342bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    }
343da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
344da1c5c15c2483cd41035e1a492c5963ac86bbcf5Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
3451b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    /* warning: this also locks a SharedCameraClient */
3461b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    shutterNotifyLocked(l.mParameters, client);
3471e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala    mShutterNotified = true;
348da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
349da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
350da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
351da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
352da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting(
353da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
354bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
355da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return DONE;
356da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
357da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
358da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing(
359da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
360bdde5f884eaf270ab4b806849f3122a46cd872ceEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
361da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return START;
362da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
363da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
364da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
365da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
366da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
3674865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
368da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            this);
369da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    {
370da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
371da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mTriggerId = l.mParameters.precaptureTriggerCounter++;
372da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
373da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId);
374da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
375da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mAeInPrecapture = false;
376da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForPrecaptureStart;
377da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
378da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
379da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
380da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait(
381da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
382da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
383da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
384da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
385da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    while (!mNewAEState) {
386da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration);
387da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) {
388da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mTimeoutCount--;
389da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
390da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
391da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
392da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mTimeoutCount <= 0) {
393da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGW("Timed out waiting for precapture %s",
394da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                mAeInPrecapture ? "end" : "start");
395da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return STANDARD_CAPTURE;
396da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
397da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mNewAEState) {
398da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (!mAeInPrecapture) {
399da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            // Waiting to see PRECAPTURE state
400da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
401da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
402da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGV("%s: Got precapture start", __FUNCTION__);
403da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                mAeInPrecapture = true;
404da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                mTimeoutCount = kMaxTimeoutsForPrecaptureEnd;
405da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
406da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
407da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            // Waiting to see PRECAPTURE state end
408da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
409da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
410da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                ALOGV("%s: Got precapture end", __FUNCTION__);
411da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                return STANDARD_CAPTURE;
412da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            }
413da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
414da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewAEState = false;
415da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
416da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
417da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
418da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
419da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
420da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
421da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
422da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
423da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
424da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Vector<uint8_t> outputStreams;
425da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
426da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    outputStreams.push(client->getPreviewStreamId());
427da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    outputStreams.push(client->getCaptureStreamId());
428da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
429da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (l.mParameters.previewCallbackFlags &
430da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
431da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(client->getCallbackStreamId());
432da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
433da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
434da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
435da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        outputStreams.push(client->getRecordingStreamId());
436da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
437da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
438da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
439da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            outputStreams);
440da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res == OK) {
441da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.update(ANDROID_REQUEST_ID,
442da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                &mCaptureId, 1);
443da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
444da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res == OK) {
445da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mCaptureRequest.sort();
446da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
447da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
448da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
449da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
450da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
451da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
452da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
453da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
454da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
455da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
456da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
457da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId());
458da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
459da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
460da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
461da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (l.mParameters.state == Parameters::STILL_CAPTURE) {
4624865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        res = client->stopStream();
463da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
464da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
465da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    "%s (%d)",
466da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
467da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return DONE;
468da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
469da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
470da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
471da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = client->getCameraDevice()->capture(captureCopy);
472da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
473da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
474da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                "%s (%d)",
475da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
476da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
477da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
478da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
479da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
480da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
481da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
482da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
483da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait(
484da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
485da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
486da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
487da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
488da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    while (!mNewFrameReceived) {
489da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration);
490da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) {
491da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mTimeoutCount--;
492da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
493da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
494da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
4951e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala    if (mNewFrameReceived && !mShutterNotified) {
4961e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
4971e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala        /* warning: this also locks a SharedCameraClient */
4981e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala        shutterNotifyLocked(l.mParameters, client);
4991e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala        mShutterNotified = true;
5001e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala    }
5011e6ccd5c78016ac9f9247cb8337cf263b3afb73eEino-Ville Talvala    while (mNewFrameReceived && !mNewCaptureReceived) {
502da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
503da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res == TIMED_OUT) {
504da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            mTimeoutCount--;
505da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
506da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
507da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
508da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mTimeoutCount <= 0) {
509da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGW("Timed out waiting for capture to complete");
510da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
511da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
512da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mNewFrameReceived && mNewCaptureReceived) {
513da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (mNewFrameId != mCaptureId) {
514da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGW("Mismatched capture frame IDs: Expected %d, got %d",
515da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    mCaptureId, mNewFrameId);
516da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
517da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        camera_metadata_entry_t entry;
518da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP);
519da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (entry.count == 0) {
520da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("No timestamp field in capture frame!");
521da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
522da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (entry.data.i64[0] != mCaptureTimestamp) {
523da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGW("Mismatched capture timestamps: Metadata frame %lld,"
524da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp);
525da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
5264865c526e681366481b0ab242ffa1ead57bb02ccEino-Ville Talvala        client->removeFrameListener(mCaptureId, mCaptureId + 1, this);
527da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
528da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewFrameReceived = false;
529da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        mNewCaptureReceived = false;
530da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return DONE;
531da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
532da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
533da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
534da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
535e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart(
536e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        sp<Camera2Client> &client) {
537e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ALOGV("%s", __FUNCTION__);
538e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    status_t res;
539e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ATRACE_CALL();
540e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
541e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    // check which burst mode is set, create respective burst object
542e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    {
543e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        SharedParameters::Lock l(client->getParameters());
544e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
545e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        res = updateCaptureRequest(l.mParameters, client);
546e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        if(res != OK) {
547e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            return DONE;
548e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        }
549e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
550e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        //
551e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        // check for burst mode type in mParameters here
552e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        //
553e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        mBurstCapture = new BurstCapture(client, this);
554e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
555e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
556e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1);
557e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (res == OK) {
558e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        res = mCaptureRequest.sort();
559e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
560e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (res != OK) {
561e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
562e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter                __FUNCTION__, client->getCameraId(), strerror(-res), res);
563e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
564e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
565e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
566e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    CameraMetadata captureCopy = mCaptureRequest;
567e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (captureCopy.entryCount() == 0) {
568e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
569e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter                __FUNCTION__, client->getCameraId());
570e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
571e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
572e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
573e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    Vector<CameraMetadata> requests;
574e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    requests.push(mCaptureRequest);
575e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    res = mBurstCapture->start(requests, mCaptureId);
576e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10;
577e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return BURST_CAPTURE_WAIT;
578e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
579e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
580e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait(
581e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        sp<Camera2Client> &client) {
582e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    status_t res;
583e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    ATRACE_CALL();
584e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
585e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    while (!mNewCaptureReceived) {
586e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
587e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        if (res == TIMED_OUT) {
588e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            mTimeoutCount--;
589e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            break;
590e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        }
591e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
592e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
593e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (mTimeoutCount <= 0) {
594e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        ALOGW("Timed out waiting for burst capture to complete");
595e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
596e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
597e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    if (mNewCaptureReceived) {
598e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        mNewCaptureReceived = false;
599e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        // TODO: update mCaptureId to last burst's capture ID + 1?
600e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        return DONE;
601e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    }
602e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
603e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return BURST_CAPTURE_WAIT;
604e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
605e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
606da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters &params,
607da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        sp<Camera2Client> &client) {
608da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
609da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
610da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
611da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        res = client->getCameraDevice()->createDefaultRequest(
612da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                CAMERA2_TEMPLATE_STILL_CAPTURE,
613da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                &mCaptureRequest);
614da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        if (res != OK) {
615da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
616da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, client->getCameraId(),
617da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    strerror(-res), res);
618da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            return res;
619da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
620da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
621da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
622da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = params.updateRequest(&mCaptureRequest);
623da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) {
624da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
625da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
626da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                strerror(-res), res);
627da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        return res;
628da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
629da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
630ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = params.updateRequestJpeg(&mCaptureRequest);
631ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) {
632ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update JPEG entries of capture "
633ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
634ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                strerror(-res), res);
635ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        return res;
636da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
637da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
638da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
639da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
640da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
6411b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters &params,
6421b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            sp<Camera2Client> client) {
6431b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    ATRACE_CALL();
6441b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
6451b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    if (params.state == Parameters::STILL_CAPTURE && params.playShutterSound) {
6461b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
6471b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    }
6481b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
6491b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    {
6501b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin        Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient);
6511b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
6521b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin        ALOGV("%s: Notifying of shutter close to client", __FUNCTION__);
6531b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin        if (l.mCameraClient != 0) {
6541b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            // ShutterCallback
6551b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            l.mCameraClient->notifyCallback(CAMERA_MSG_SHUTTER,
6561b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
6571b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
6581b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            // RawCallback with null buffer
6591b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            l.mCameraClient->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY,
6601b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
6611b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin        } else {
6621b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin            ALOGV("%s: No client!", __FUNCTION__);
6631b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin        }
6641b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin    }
6651b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin}
6661b65ae9b7bcb4302f80ddc1464f1aa2c7483efb8Igor Murashkin
667da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
668da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace camera2
669da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}; // namespace android
670