CaptureSequencer.cpp revision c451d0f8098c9efd21d796e32f739af1915f9aba
169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/*
269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *
469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * you may not use this file except in compliance with the License.
669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * You may obtain a copy of the License at
769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *
869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala *
1069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * See the License for the specific language governing permissions and
1469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * limitations under the License.
1569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */
1669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define LOG_TAG "Camera2-CaptureSequencer"
1869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala//#define LOG_NDEBUG 0
2069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
21e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <inttypes.h>
22e5729fac81c8a984e984fefc90afc64135817d4fColin Cross
2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Log.h>
2469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Trace.h>
2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Vector.h>
2669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/Camera2Client.h"
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/CaptureSequencer.h"
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/Parameters.h"
30d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala#include "api1/client2/ZslProcessor.h"
3169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android {
3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 {
3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */
3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client):
3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Thread(false),
3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture(false),
4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy(false),
4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState(false),
4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived(false),
4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived(false),
44b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        mNewCaptureErrorCnt(0),
45ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        mShutterNotified(false),
46216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        mHalNotifiedShutter(false),
47216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        mShutterCaptureId(-1),
4869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mClient(client),
4969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureState(IDLE),
502b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        mStateTransitionCount(0),
5169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId(0),
5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTimeoutCount(0),
53786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        mCaptureId(Camera2Client::kCaptureRequestIdStart),
54786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        mMsgType(0) {
55c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() {
5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
62d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) {
6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mZslProcessor = processor;
6569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
6669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
67786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkinstatus_t CaptureSequencer::startCapture(int msgType) {
68c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mBusy) {
7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Already busy capturing!", __FUNCTION__);
7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mStartCapture) {
76786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        mMsgType = msgType;
7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = true;
7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCaptureSignal.signal();
7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
8169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
8269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
83e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) {
84e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ATRACE_CALL();
85e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ALOGV("%s: Waiting for idle", __FUNCTION__);
86e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    Mutex::Autolock l(mStateMutex);
87e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    status_t res = -1;
88e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    while (mCaptureState != IDLE) {
89e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        nsecs_t startTime = systemTime();
90e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
91e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        res = mStateChanged.waitRelative(mStateMutex, timeout);
92e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        if (res != OK) return res;
93e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
94e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        timeout -= (systemTime() - startTime);
95e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
96e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ALOGV("%s: Now idle", __FUNCTION__);
97e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    return OK;
98e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala}
99e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) {
10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAEState = newState;
10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAETriggerId = triggerId;
10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewAEState) {
10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = true;
10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewNotifySignal.signal();
10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
111216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yehvoid CaptureSequencer::notifyShutter(const CaptureResultExtras& resultExtras,
112216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh                                     nsecs_t timestamp) {
113216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    ATRACE_CALL();
114d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    (void) timestamp;
115216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    Mutex::Autolock l(mInputMutex);
116216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    if (!mHalNotifiedShutter && resultExtras.requestId == mShutterCaptureId) {
117216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        mHalNotifiedShutter = true;
118216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        mShutterNotifySignal.signal();
119216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    }
120216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh}
121216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
122cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CaptureSequencer::onResultAvailable(const CaptureResult &result) {
12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
124cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    ALOGV("%s: New result available.", __FUNCTION__);
12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
126cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    mNewFrameId = result.mResultExtras.requestId;
127cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    mNewFrame = result.mMetadata;
12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewFrameReceived) {
12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = true;
13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameSignal.signal();
13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp,
135b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        sp<MemoryBase> captureBuffer, bool captureError) {
13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
137c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureTimestamp = timestamp;
14052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer = captureBuffer;
14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewCaptureReceived) {
14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = true;
143b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        if (captureError) {
144b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            mNewCaptureErrorCnt++;
145b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        } else {
146b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            mNewCaptureErrorCnt = 0;
147b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        }
14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureSignal.signal();
14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
153ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinvoid CaptureSequencer::dump(int fd, const Vector<String16>& /*args*/) {
15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    String8 result;
15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request:\n";
15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
16069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request: undefined\n";
16169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
16269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
16369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result = String8::format("    Current capture state: %s\n",
16469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            kStateNames[mCaptureState]);
16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.append("    Latest captured frame:\n");
16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    write(fd, result.string(), result.size());
16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrame.dump(fd, 2, 6);
16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */
17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] =
17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{
17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "IDLE",
17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "START",
17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_START",
17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_WAITING",
17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_REPROCESSING",
17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_START",
180e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_PRECAPTURE_WAIT",
181e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_CAPTURE",
182e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_CAPTURE_WAIT",
18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "DONE",
18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ERROR",
18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "UNKNOWN"
18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager
18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageIdle,
19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStart,
19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslStart,
19369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslWaiting,
19469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslReprocessing,
19569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardStart,
19669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardPrecaptureWait,
19769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCapture,
19869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCaptureWait,
19969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageDone,
20069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
20169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
20269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() {
20369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
20469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<Camera2Client> client = mClient.promote();
20569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (client == 0) return false;
20669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
207e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    CaptureState currentState;
208e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    {
209e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        Mutex::Autolock l(mStateMutex);
210e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        currentState = mCaptureState;
211e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
212e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
213e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    currentState = (this->*kStateManagers[currentState])(client);
214e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
215e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    Mutex::Autolock l(mStateMutex);
216e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    if (currentState != mCaptureState) {
2172b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (mCaptureState != IDLE) {
2182b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(kStateNames[mCaptureState], mStateTransitionCount);
2192b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
220e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        mCaptureState = currentState;
2212b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        mStateTransitionCount++;
2222b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (mCaptureState != IDLE) {
2232b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_BEGIN(kStateNames[mCaptureState], mStateTransitionCount);
2242b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
225e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        ALOGV("Camera %d: New capture state %s",
226e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                client->getCameraId(), kStateNames[mCaptureState]);
227e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        mStateChanged.signal();
228e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
229e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
230e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    if (mCaptureState == ERROR) {
231e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        ALOGE("Camera %d: Stopping capture sequencer due to error",
232e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                client->getCameraId());
23369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return false;
23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
23569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
23669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return true;
23769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
23869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
239ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor MurashkinCaptureSequencer::CaptureState CaptureSequencer::manageIdle(
240ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
24169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
24369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mStartCapture) {
24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mStartCaptureSignal.waitRelative(mInputMutex,
24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                kWaitDuration);
24669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) break;
24769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
24869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mStartCapture) {
24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = false;
25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = true;
25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return START;
25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
25469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
25569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
25669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) {
25752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    status_t res = OK;
25869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
25969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureId++;
2604c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) {
2614c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        mCaptureId = Camera2Client::kCaptureRequestIdStart;
2624c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    }
26369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
26469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Mutex::Autolock l(mInputMutex);
26569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = false;
26669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
26769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
2682b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int takePictureCounter = 0;
26952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    {
27052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
27152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        switch (l.mParameters.state) {
272e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala            case Parameters::DISCONNECTED:
273e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                ALOGW("%s: Camera %d: Discarding image data during shutdown ",
274e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                        __FUNCTION__, client->getCameraId());
275e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                res = INVALID_OPERATION;
276e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                break;
27752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
27826bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                res = client->getCameraDevice()->waitUntilDrained();
27926bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                if (res != OK) {
28026bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                    ALOGE("%s: Camera %d: Can't idle after still capture: "
28126bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                            "%s (%d)", __FUNCTION__, client->getCameraId(),
28226bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                            strerror(-res), res);
28326bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                }
28452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
28552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
28652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
28752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
28852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
28952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            default:
29052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                ALOGE("%s: Camera %d: Still image produced unexpectedly "
29152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        "in state %s!",
29252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        __FUNCTION__, client->getCameraId(),
29352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        Parameters::getStateName(l.mParameters.state));
29452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                res = INVALID_OPERATION;
29552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
2962b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        takePictureCounter = l.mParameters.takePictureCounter;
29752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    }
298d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
2995a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    if (processor != 0) {
3002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGV("%s: Memory optimization, clearing ZSL queue",
3012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin              __FUNCTION__);
3025a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala        processor->clearZslQueue();
3035a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    }
3045a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala
3054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
3064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Fire the jpegCallback in Camera#takePicture(..., jpegCallback)
3074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
30852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    if (mCaptureBuffer != 0 && res == OK) {
3092b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_END(Camera2Client::kTakepictureLabel, takePictureCounter);
3102b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
311a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        Camera2Client::SharedCameraCallbacks::Lock
312a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l(client->mSharedCameraCallbacks);
31352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        ALOGV("%s: Sending still image to client", __FUNCTION__);
314a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        if (l.mRemoteCallback != 0) {
315a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
31652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                    mCaptureBuffer, NULL);
31752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        } else {
31852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            ALOGV("%s: No client!", __FUNCTION__);
31952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
32152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer.clear();
32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart(
32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
328c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CaptureState nextState = DONE;
33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = updateCaptureRequest(l.mParameters, client);
33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK ) {
33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)",
33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
33869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
341c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    else if (l.mParameters.useZeroShutterLag() &&
3425a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE &&
3435a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.flashMode != Parameters::FLASH_MODE_ON) {
34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = ZSL_START;
34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = STANDARD_START;
34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
348216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    {
349216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        Mutex::Autolock l(mInputMutex);
350216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        mShutterCaptureId = mCaptureId;
351216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        mHalNotifiedShutter = false;
352216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    }
353ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    mShutterNotified = false;
35469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return nextState;
35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart(
35969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
3602954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
362d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (processor == 0) {
36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: No ZSL queue to use!", __FUNCTION__);
36569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
36669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
36769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
36825a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // We don't want to get partial results for ZSL capture.
3694c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
37025a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            this,
37125a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            /*sendPartials*/false);
37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Actually select the right thing here.
3742954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    res = processor->pushToReprocess(mCaptureId);
3752954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    if (res != OK) {
3762274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        if (res == NOT_ENOUGH_DATA) {
3772274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, "
3782274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    "falling back to normal capture", __FUNCTION__,
3792274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    client->getCameraId());
3802274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        } else {
3812274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)",
3822274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
3832274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        }
3842954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala        return STANDARD_START;
3852954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    }
38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
387a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
388a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    /* warning: this also locks a SharedCameraCallbacks */
389786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin    shutterNotifyLocked(l.mParameters, client, mMsgType);
390ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    mShutterNotified = true;
39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting(
396ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
3972954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return DONE;
39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing(
402ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
4032954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return START;
40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
4104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
411b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He    bool isAeConverged = false;
4124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Get the onFrameAvailable callback when the requestID == mCaptureId
41325a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // We don't want to get partial results for normal capture, as we need
41425a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // Get ANDROID_SENSOR_TIMESTAMP from the capture result, but partial
41525a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // result doesn't have to have this metadata available.
41625a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // TODO: Update to use the HALv3 shutter notification for remove the
41725a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // need for this listener and make it faster. see bug 12530628.
4184c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
41925a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            this,
42025a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            /*sendPartials*/false);
421b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He
422b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He    {
423b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        Mutex::Autolock l(mInputMutex);
424b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        isAeConverged = (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED);
425b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He    }
426b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He
42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
429b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        // Skip AE precapture when it is already converged and not in force flash mode.
430b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        if (l.mParameters.flashMode != Parameters::FLASH_MODE_ON && isAeConverged) {
431b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He            return STANDARD_CAPTURE;
432b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        }
433b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He
43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId = l.mParameters.precaptureTriggerCounter++;
43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId);
43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAeInPrecapture = false;
43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForPrecaptureStart;
44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait(
444ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
44869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewAEState) {
44969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration);
45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for precapture %s",
45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture ? "end" : "start");
45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return STANDARD_CAPTURE;
45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewAEState) {
46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (!mAeInPrecapture) {
46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state
463e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He            if (mAETriggerId == mTriggerId) {
464e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                if (mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
465e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    ALOGV("%s: Got precapture start", __FUNCTION__);
466e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    mAeInPrecapture = true;
467e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    mTimeoutCount = kMaxTimeoutsForPrecaptureEnd;
468e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                } else if (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED ||
469e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                        mAEState == ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED) {
470e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    // It is legal to transit to CONVERGED or FLASH_REQUIRED
471e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    // directly after a trigger.
472e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    ALOGV("%s: AE is already in good state, start capture", __FUNCTION__);
473e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    return STANDARD_CAPTURE;
474e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                }
47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state end
47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
47969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
48069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture end", __FUNCTION__);
48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                return STANDARD_CAPTURE;
48269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
48369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
48469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = false;
48569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
48669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
48769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
48869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
494d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
49584b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He    uint8_t captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
4974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
4984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Set up output streams in the request
4994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - preview
5004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - capture/jpeg
5014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - callback (if preview callbacks enabled)
5024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - recording (if recording enabled)
5034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
50469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getPreviewStreamId());
505355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
506355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    int captureStreamId = client->getCaptureStreamId();
507355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (captureStreamId == Camera2Client::NO_STREAM) {
508355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        res = client->createJpegStreamL(l.mParameters);
509355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        if (res != OK || client->getCaptureStreamId() == Camera2Client::NO_STREAM) {
510355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            ALOGE("%s: Camera %d: cannot create jpeg stream for slowJpeg mode: %s (%d)",
511355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                  __FUNCTION__, client->getCameraId(), strerror(-res), res);
512355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            return DONE;
513355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
514355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
515355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
51669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getCaptureStreamId());
51769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
51869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.previewCallbackFlags &
51969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
52069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getCallbackStreamId());
52169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
52269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
52369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
52469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getRecordingStreamId());
52584b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He        captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT);
52669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
52769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
52869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
52969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            outputStreams);
53069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
53169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(ANDROID_REQUEST_ID,
53269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureId, 1);
53369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
53469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
53584b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He        res = mCaptureRequest.update(ANDROID_CONTROL_CAPTURE_INTENT,
53684b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He                &captureIntent, 1);
53784b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He    }
53884b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He    if (res == OK) {
53969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.sort();
54069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
54169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
54269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
54369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
54469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
54569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
54669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
54769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Create a capture copy since CameraDeviceBase#capture takes ownership
54969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
55269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId());
55369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
55469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
5574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Clear the streaming request for still-capture pictures
5584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *   (as opposed to i.e. video snapshots)
5594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::STILL_CAPTURE) {
5614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // API definition of takePicture() - stop preview before taking pic
5624c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        res = client->stopStream();
56369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
56569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    "%s (%d)",
56669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
56769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return DONE;
56869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
56969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
570216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
57169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
57269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = client->getCameraDevice()->capture(captureCopy);
57369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
57469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
57569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "%s (%d)",
57669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
57769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
57869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
57969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
58069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
58169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
58269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
58369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
58469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait(
58569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
58669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
5894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
590216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
591216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    // Wait for shutter callback
592216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    while (!mHalNotifiedShutter) {
593216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        if (mTimeoutCount <= 0) {
594216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            break;
595216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        }
596216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        res = mShutterNotifySignal.waitRelative(mInputMutex, kWaitDuration);
597216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        if (res == TIMED_OUT) {
598216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            mTimeoutCount--;
599216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            return STANDARD_CAPTURE_WAIT;
600216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        }
601216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    }
602216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
603216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    if (mHalNotifiedShutter) {
604216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        if (!mShutterNotified) {
605216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            SharedParameters::Lock l(client->getParameters());
606216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            /* warning: this also locks a SharedCameraCallbacks */
607216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            shutterNotifyLocked(l.mParameters, client, mMsgType);
608216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh            mShutterNotified = true;
609216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        }
610216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    } else if (mTimeoutCount <= 0) {
611216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        ALOGW("Timed out waiting for shutter notification");
612216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh        return DONE;
613216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh    }
614216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
6154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Wait for new metadata result (mNewFrame)
61669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewFrameReceived) {
61769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration);
61869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
61969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
62069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
62169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
62269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
6234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
6244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Wait until jpeg was captured by JpegProcessor
625ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    while (mNewFrameReceived && !mNewCaptureReceived) {
62669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
62769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
62869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
62969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
63069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
63169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
632b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang    if (mNewCaptureReceived) {
633b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        if (mNewCaptureErrorCnt > kMaxRetryCount) {
634b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            ALOGW("Exceeding multiple retry limit of %d due to buffer drop", kMaxRetryCount);
635b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            return DONE;
636b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        } else if (mNewCaptureErrorCnt > 0) {
637b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            ALOGW("Capture error happened, retry %d...", mNewCaptureErrorCnt);
638b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            mNewCaptureReceived = false;
639b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            return STANDARD_CAPTURE;
640b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang        }
641b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang    }
642b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang
64369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
64469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for capture to complete");
64569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
64669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
64769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewFrameReceived && mNewCaptureReceived) {
648216db7455a19a2f1a5b29e3a9610231365b6c778Yin-Chia Yeh
64969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (mNewFrameId != mCaptureId) {
65069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture frame IDs: Expected %d, got %d",
65169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mCaptureId, mNewFrameId);
65269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
65369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        camera_metadata_entry_t entry;
65469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP);
65569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.count == 0) {
65669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("No timestamp field in capture frame!");
6576056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He        } else if (entry.count == 1) {
6586056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He            if (entry.data.i64[0] != mCaptureTimestamp) {
6596056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                ALOGW("Mismatched capture timestamps: Metadata frame %" PRId64 ","
6606056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                        " captured buffer %" PRId64,
6616056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                        entry.data.i64[0],
6626056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                        mCaptureTimestamp);
6636056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He            }
6646056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He        } else {
6656056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He            ALOGE("Timestamp metadata is malformed!");
66669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
6674c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        client->removeFrameListener(mCaptureId, mCaptureId + 1, this);
66869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
66969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = false;
67069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = false;
67169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
67269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
67369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
67469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
67569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
67669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters &params,
67769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
67869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
67969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
68069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
68169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = client->getCameraDevice()->createDefaultRequest(
68269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                CAMERA2_TEMPLATE_STILL_CAPTURE,
68369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureRequest);
68469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
68569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
68669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, client->getCameraId(),
68769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    strerror(-res), res);
68869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return res;
68969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
69069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
69169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
69269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = params.updateRequest(&mCaptureRequest);
69369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
69469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
69569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
69669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                strerror(-res), res);
69769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return res;
69869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
69969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
700db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    res = params.updateRequestJpeg(&mCaptureRequest);
701db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (res != OK) {
702db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update JPEG entries of capture "
703db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
704db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                strerror(-res), res);
705db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        return res;
70669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
70769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
70869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
70969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
71069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
711707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters &params,
712786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin            sp<Camera2Client> client, int msgType) {
713707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    ATRACE_CALL();
714707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
715786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin    if (params.state == Parameters::STILL_CAPTURE
716786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        && params.playShutterSound
717786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        && (msgType & CAMERA_MSG_SHUTTER)) {
718707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
719707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    }
720707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
721707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    {
722a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        Camera2Client::SharedCameraCallbacks::Lock
723a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l(client->mSharedCameraCallbacks);
724707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
725707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        ALOGV("%s: Notifying of shutter close to client", __FUNCTION__);
726a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        if (l.mRemoteCallback != 0) {
727707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            // ShutterCallback
728a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_SHUTTER,
729707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
730707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
731707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            // RawCallback with null buffer
732a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY,
733707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
734707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        } else {
735707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            ALOGV("%s: No client!", __FUNCTION__);
736707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        }
737707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    }
738707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin}
739707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
74069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
74169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2
74269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android
743