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/BurstCapture.h"
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/Parameters.h"
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "api1/client2/ZslProcessorInterface.h"
3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android {
3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 {
3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */
3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client):
3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Thread(false),
4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture(false),
4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy(false),
4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState(false),
4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived(false),
4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived(false),
45ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        mShutterNotified(false),
4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mClient(client),
4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureState(IDLE),
482b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        mStateTransitionCount(0),
4969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId(0),
5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTimeoutCount(0),
51786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        mCaptureId(Camera2Client::kCaptureRequestIdStart),
52786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        mMsgType(0) {
53c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() {
5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
602fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkinvoid CaptureSequencer::setZslProcessor(wp<ZslProcessorInterface> processor) {
6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
6269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mZslProcessor = processor;
6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
65786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkinstatus_t CaptureSequencer::startCapture(int msgType) {
66c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mBusy) {
7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Already busy capturing!", __FUNCTION__);
7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mStartCapture) {
74786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        mMsgType = msgType;
7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = true;
7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCaptureSignal.signal();
7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
81e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) {
82e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ATRACE_CALL();
83e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ALOGV("%s: Waiting for idle", __FUNCTION__);
84e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    Mutex::Autolock l(mStateMutex);
85e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    status_t res = -1;
86e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    while (mCaptureState != IDLE) {
87e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        nsecs_t startTime = systemTime();
88e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
89e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        res = mStateChanged.waitRelative(mStateMutex, timeout);
90e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        if (res != OK) return res;
91e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
92e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        timeout -= (systemTime() - startTime);
93e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
94e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ALOGV("%s: Now idle", __FUNCTION__);
95e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    return OK;
96e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala}
97e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) {
9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAEState = newState;
10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAETriggerId = triggerId;
10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewAEState) {
10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = true;
10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewNotifySignal.signal();
10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
109cb0652e5a850b2fcd919e977247e87239efaf70eJianing Weivoid CaptureSequencer::onResultAvailable(const CaptureResult &result) {
11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
111cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    ALOGV("%s: New result available.", __FUNCTION__);
11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
113cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    mNewFrameId = result.mResultExtras.requestId;
114cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    mNewFrame = result.mMetadata;
11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewFrameReceived) {
11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = true;
11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameSignal.signal();
11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
12152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp,
12252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        sp<MemoryBase> captureBuffer) {
12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
124c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureTimestamp = timestamp;
12752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer = captureBuffer;
12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewCaptureReceived) {
12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = true;
13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureSignal.signal();
13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
135ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinvoid CaptureSequencer::dump(int fd, const Vector<String16>& /*args*/) {
13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    String8 result;
13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request:\n";
13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request: undefined\n";
14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result = String8::format("    Current capture state: %s\n",
14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            kStateNames[mCaptureState]);
14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.append("    Latest captured frame:\n");
14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    write(fd, result.string(), result.size());
14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrame.dump(fd, 2, 6);
15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */
15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] =
15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{
15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "IDLE",
15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "START",
15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_START",
15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_WAITING",
16069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_REPROCESSING",
16169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_START",
162e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_PRECAPTURE_WAIT",
163e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_CAPTURE",
164e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_CAPTURE_WAIT",
165c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    "BURST_CAPTURE_START",
166c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    "BURST_CAPTURE_WAIT",
16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "DONE",
16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ERROR",
16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "UNKNOWN"
17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager
17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageIdle,
17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStart,
17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslStart,
17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslWaiting,
17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslReprocessing,
17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardStart,
18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardPrecaptureWait,
18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCapture,
18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCaptureWait,
183c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    &CaptureSequencer::manageBurstCaptureStart,
184c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    &CaptureSequencer::manageBurstCaptureWait,
18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageDone,
18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() {
18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<Camera2Client> client = mClient.promote();
19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (client == 0) return false;
19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
193e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    CaptureState currentState;
194e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    {
195e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        Mutex::Autolock l(mStateMutex);
196e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        currentState = mCaptureState;
197e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
198e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
199e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    currentState = (this->*kStateManagers[currentState])(client);
200e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
201e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    Mutex::Autolock l(mStateMutex);
202e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    if (currentState != mCaptureState) {
2032b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (mCaptureState != IDLE) {
2042b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_END(kStateNames[mCaptureState], mStateTransitionCount);
2052b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
206e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        mCaptureState = currentState;
2072b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        mStateTransitionCount++;
2082b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        if (mCaptureState != IDLE) {
2092b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala            ATRACE_ASYNC_BEGIN(kStateNames[mCaptureState], mStateTransitionCount);
2102b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        }
211e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        ALOGV("Camera %d: New capture state %s",
212e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                client->getCameraId(), kStateNames[mCaptureState]);
213e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        mStateChanged.signal();
214e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
215e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
216e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    if (mCaptureState == ERROR) {
217e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        ALOGE("Camera %d: Stopping capture sequencer due to error",
218e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                client->getCameraId());
21969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return false;
22069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
22169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
22269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return true;
22369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
22469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
225ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor MurashkinCaptureSequencer::CaptureState CaptureSequencer::manageIdle(
226ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
22769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
22869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
22969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mStartCapture) {
23069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mStartCaptureSignal.waitRelative(mInputMutex,
23169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                kWaitDuration);
23269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) break;
23369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mStartCapture) {
23569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = false;
23669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = true;
23769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return START;
23869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
23969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
24069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
24169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) {
24352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    status_t res = OK;
24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureId++;
2464c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) {
2474c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        mCaptureId = Camera2Client::kCaptureRequestIdStart;
2484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    }
24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Mutex::Autolock l(mInputMutex);
25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = false;
25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
2542b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    int takePictureCounter = 0;
25552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    {
25652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
25752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        switch (l.mParameters.state) {
258e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala            case Parameters::DISCONNECTED:
259e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                ALOGW("%s: Camera %d: Discarding image data during shutdown ",
260e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                        __FUNCTION__, client->getCameraId());
261e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                res = INVALID_OPERATION;
262e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                break;
26352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
26426bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                res = client->getCameraDevice()->waitUntilDrained();
26526bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                if (res != OK) {
26626bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                    ALOGE("%s: Camera %d: Can't idle after still capture: "
26726bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                            "%s (%d)", __FUNCTION__, client->getCameraId(),
26826bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                            strerror(-res), res);
26926bc908b3dafb5d80f092a22c5c71116526eae06Eino-Ville Talvala                }
27052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
27152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
27252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
27352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
27452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
27552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            default:
27652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                ALOGE("%s: Camera %d: Still image produced unexpectedly "
27752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        "in state %s!",
27852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        __FUNCTION__, client->getCameraId(),
27952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        Parameters::getStateName(l.mParameters.state));
28052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                res = INVALID_OPERATION;
28152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
2822b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        takePictureCounter = l.mParameters.takePictureCounter;
28352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    }
2842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<ZslProcessorInterface> processor = mZslProcessor.promote();
2855a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    if (processor != 0) {
2862fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        ALOGV("%s: Memory optimization, clearing ZSL queue",
2872fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin              __FUNCTION__);
2885a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala        processor->clearZslQueue();
2895a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    }
2905a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala
2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Fire the jpegCallback in Camera#takePicture(..., jpegCallback)
2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
29452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    if (mCaptureBuffer != 0 && res == OK) {
2952b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala        ATRACE_ASYNC_END(Camera2Client::kTakepictureLabel, takePictureCounter);
2962b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
297a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        Camera2Client::SharedCameraCallbacks::Lock
298a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l(client->mSharedCameraCallbacks);
29952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        ALOGV("%s: Sending still image to client", __FUNCTION__);
300a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        if (l.mRemoteCallback != 0) {
301a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
30252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                    mCaptureBuffer, NULL);
30352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        } else {
30452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            ALOGV("%s: No client!", __FUNCTION__);
30552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
30752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer.clear();
30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart(
31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
314c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CaptureState nextState = DONE;
31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = updateCaptureRequest(l.mParameters, client);
32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK ) {
32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)",
32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
327c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE &&
328c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            l.mParameters.state == Parameters::STILL_CAPTURE) {
329c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        nextState = BURST_CAPTURE_START;
330c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
331c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    else if (l.mParameters.zslMode &&
3325a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE &&
3335a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.flashMode != Parameters::FLASH_MODE_ON) {
33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = ZSL_START;
33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = STANDARD_START;
33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
338ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    mShutterNotified = false;
33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return nextState;
34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart(
34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
3452954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
3472fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    sp<ZslProcessorInterface> processor = mZslProcessor.promote();
34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (processor == 0) {
34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: No ZSL queue to use!", __FUNCTION__);
35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35325a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // We don't want to get partial results for ZSL capture.
3544c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
35525a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            this,
35625a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            /*sendPartials*/false);
35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Actually select the right thing here.
3592954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    res = processor->pushToReprocess(mCaptureId);
3602954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    if (res != OK) {
3612274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        if (res == NOT_ENOUGH_DATA) {
3622274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, "
3632274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    "falling back to normal capture", __FUNCTION__,
3642274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    client->getCameraId());
3652274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        } else {
3662274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)",
3672274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
3682274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        }
3692954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala        return STANDARD_START;
3702954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    }
37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
372a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
373a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin    /* warning: this also locks a SharedCameraCallbacks */
374786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin    shutterNotifyLocked(l.mParameters, client, mMsgType);
375ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    mShutterNotified = true;
37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting(
381ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
3822954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return DONE;
38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing(
387ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
3882954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return START;
39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
3954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
396b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He    bool isAeConverged = false;
3974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Get the onFrameAvailable callback when the requestID == mCaptureId
39825a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // We don't want to get partial results for normal capture, as we need
39925a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // Get ANDROID_SENSOR_TIMESTAMP from the capture result, but partial
40025a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // result doesn't have to have this metadata available.
40125a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // TODO: Update to use the HALv3 shutter notification for remove the
40225a0aef19e170d2695f64b4c48296e7914155a88Zhijun He    // need for this listener and make it faster. see bug 12530628.
4034c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
40425a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            this,
40525a0aef19e170d2695f64b4c48296e7914155a88Zhijun He            /*sendPartials*/false);
406b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He
407b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He    {
408b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        Mutex::Autolock l(mInputMutex);
409b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        isAeConverged = (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED);
410b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He    }
411b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He
41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
414b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        // Skip AE precapture when it is already converged and not in force flash mode.
415b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        if (l.mParameters.flashMode != Parameters::FLASH_MODE_ON && isAeConverged) {
416b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He            return STANDARD_CAPTURE;
417b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He        }
418b790abf4d17f1c6865af7eb1595ec94dc0306447Zhijun He
41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId = l.mParameters.precaptureTriggerCounter++;
42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId);
42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAeInPrecapture = false;
42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForPrecaptureStart;
42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait(
429ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewAEState) {
43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration);
43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for precapture %s",
44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture ? "end" : "start");
44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return STANDARD_CAPTURE;
44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewAEState) {
44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (!mAeInPrecapture) {
44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state
448e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He            if (mAETriggerId == mTriggerId) {
449e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                if (mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
450e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    ALOGV("%s: Got precapture start", __FUNCTION__);
451e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    mAeInPrecapture = true;
452e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    mTimeoutCount = kMaxTimeoutsForPrecaptureEnd;
453e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                } else if (mAEState == ANDROID_CONTROL_AE_STATE_CONVERGED ||
454e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                        mAEState == ANDROID_CONTROL_AE_STATE_FLASH_REQUIRED) {
455e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    // It is legal to transit to CONVERGED or FLASH_REQUIRED
456e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    // directly after a trigger.
457e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    ALOGV("%s: AE is already in good state, start capture", __FUNCTION__);
458e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                    return STANDARD_CAPTURE;
459e8339fb87364469feb1f2cbda92889efecb79a7cZhijun He                }
46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state end
46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture end", __FUNCTION__);
46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                return STANDARD_CAPTURE;
46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
46969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = false;
47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
479d1d6467d3bcbc1305eeba0176a2edf04925c368eZhijun He    Vector<int32_t> outputStreams;
48084b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He    uint8_t captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
4824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
4834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Set up output streams in the request
4844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - preview
4854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - capture/jpeg
4864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - callback (if preview callbacks enabled)
4874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *  - recording (if recording enabled)
4884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getPreviewStreamId());
49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getCaptureStreamId());
49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.previewCallbackFlags &
49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
49469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getCallbackStreamId());
49569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
49769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
49869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getRecordingStreamId());
49984b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He        captureIntent = static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT);
50069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
50169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
50269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
50369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            outputStreams);
50469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
50569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(ANDROID_REQUEST_ID,
50669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureId, 1);
50769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
50869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
50984b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He        res = mCaptureRequest.update(ANDROID_CONTROL_CAPTURE_INTENT,
51084b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He                &captureIntent, 1);
51184b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He    }
51284b7fb0c88ddd05ed7c148c82fe1691040a9404dZhijun He    if (res == OK) {
51369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.sort();
51469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
51569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
51669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
51769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
51869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
51969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
52069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
52169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Create a capture copy since CameraDeviceBase#capture takes ownership
52369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
52469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
52569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
52669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId());
52769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
52869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
52969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    /**
5314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     * Clear the streaming request for still-capture pictures
5324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     *   (as opposed to i.e. video snapshots)
5334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin     */
53469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::STILL_CAPTURE) {
5354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // API definition of takePicture() - stop preview before taking pic
5364c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        res = client->stopStream();
53769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
53869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
53969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    "%s (%d)",
54069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
54169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return DONE;
54269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
54369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
54469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
54569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = client->getCameraDevice()->capture(captureCopy);
54669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
54769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
54869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "%s (%d)",
54969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
55269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
55369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
55469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
55669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
55769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait(
55869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
55969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
56169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
5624d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
5634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Wait for new metadata result (mNewFrame)
56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewFrameReceived) {
56569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration);
56669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
56769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
56869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
56969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
57069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
5714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
5724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Approximation of the shutter being closed
5734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // - TODO: use the hal3 exposure callback in Camera3Device instead
574ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    if (mNewFrameReceived && !mShutterNotified) {
575ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
576a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        /* warning: this also locks a SharedCameraCallbacks */
577786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        shutterNotifyLocked(l.mParameters, client, mMsgType);
578ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        mShutterNotified = true;
579ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    }
5804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
5814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    // Wait until jpeg was captured by JpegProcessor
582ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    while (mNewFrameReceived && !mNewCaptureReceived) {
58369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
58469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
58569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
58669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
58969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
59069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for capture to complete");
59169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
59269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
59369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewFrameReceived && mNewCaptureReceived) {
59469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (mNewFrameId != mCaptureId) {
59569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture frame IDs: Expected %d, got %d",
59669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mCaptureId, mNewFrameId);
59769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
59869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        camera_metadata_entry_t entry;
59969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP);
60069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.count == 0) {
60169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("No timestamp field in capture frame!");
6026056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He        } else if (entry.count == 1) {
6036056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He            if (entry.data.i64[0] != mCaptureTimestamp) {
6046056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                ALOGW("Mismatched capture timestamps: Metadata frame %" PRId64 ","
6056056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                        " captured buffer %" PRId64,
6066056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                        entry.data.i64[0],
6076056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He                        mCaptureTimestamp);
6086056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He            }
6096056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He        } else {
6106056bdda5b17c62ba320c806489e4d1a3b7653c7Zhijun He            ALOGE("Timestamp metadata is malformed!");
61169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
6124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        client->removeFrameListener(mCaptureId, mCaptureId + 1, this);
61369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
61469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = false;
61569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = false;
61669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
61769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
61869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
61969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
62069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
621c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart(
622c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        sp<Camera2Client> &client) {
623c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
624c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    status_t res;
625c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ATRACE_CALL();
626c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
627c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    // check which burst mode is set, create respective burst object
628c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    {
629c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        SharedParameters::Lock l(client->getParameters());
630c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
631c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = updateCaptureRequest(l.mParameters, client);
632c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        if(res != OK) {
633c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            return DONE;
634c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        }
635c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
636c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        //
637c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        // check for burst mode type in mParameters here
638c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        //
639c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        mBurstCapture = new BurstCapture(client, this);
640c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
641c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
642c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1);
643c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (res == OK) {
644c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = mCaptureRequest.sort();
645c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
646c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (res != OK) {
647c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
648c3dbf1a40df85b75e5805382838a90416f69730fJames Painter                __FUNCTION__, client->getCameraId(), strerror(-res), res);
649c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
650c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
651c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
652c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    CameraMetadata captureCopy = mCaptureRequest;
653c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (captureCopy.entryCount() == 0) {
654c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
655c3dbf1a40df85b75e5805382838a90416f69730fJames Painter                __FUNCTION__, client->getCameraId());
656c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
657c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
658c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
659c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    Vector<CameraMetadata> requests;
660c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    requests.push(mCaptureRequest);
661c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    res = mBurstCapture->start(requests, mCaptureId);
662c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10;
663c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return BURST_CAPTURE_WAIT;
664c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
665c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
666c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait(
667ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin        sp<Camera2Client> &/*client*/) {
668c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    status_t res;
669c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ATRACE_CALL();
670c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
671c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    while (!mNewCaptureReceived) {
672c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
673c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        if (res == TIMED_OUT) {
674c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            mTimeoutCount--;
675c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            break;
676c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        }
677c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
678c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
679c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (mTimeoutCount <= 0) {
680c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGW("Timed out waiting for burst capture to complete");
681c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
682c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
683c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (mNewCaptureReceived) {
684c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        mNewCaptureReceived = false;
685c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        // TODO: update mCaptureId to last burst's capture ID + 1?
686c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
687c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
688c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
689c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return BURST_CAPTURE_WAIT;
690c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
691c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
69269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters &params,
69369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
69469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
69569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
69669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
69769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = client->getCameraDevice()->createDefaultRequest(
69869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                CAMERA2_TEMPLATE_STILL_CAPTURE,
69969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureRequest);
70069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
70169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
70269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, client->getCameraId(),
70369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    strerror(-res), res);
70469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return res;
70569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
70669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
70769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
70869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = params.updateRequest(&mCaptureRequest);
70969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
71069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
71169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
71269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                strerror(-res), res);
71369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return res;
71469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
71569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
716db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    res = params.updateRequestJpeg(&mCaptureRequest);
717db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (res != OK) {
718db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update JPEG entries of capture "
719db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
720db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                strerror(-res), res);
721db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        return res;
72269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
72369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
72469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
72569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
72669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
727707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters &params,
728786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin            sp<Camera2Client> client, int msgType) {
729707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    ATRACE_CALL();
730707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
731786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin    if (params.state == Parameters::STILL_CAPTURE
732786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        && params.playShutterSound
733786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin        && (msgType & CAMERA_MSG_SHUTTER)) {
734707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
735707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    }
736707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
737707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    {
738a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        Camera2Client::SharedCameraCallbacks::Lock
739a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l(client->mSharedCameraCallbacks);
740707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
741707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        ALOGV("%s: Notifying of shutter close to client", __FUNCTION__);
742a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin        if (l.mRemoteCallback != 0) {
743707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            // ShutterCallback
744a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_SHUTTER,
745707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
746707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
747707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            // RawCallback with null buffer
748a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin            l.mRemoteCallback->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY,
749707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
750707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        } else {
751707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            ALOGV("%s: No client!", __FUNCTION__);
752707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        }
753707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    }
754707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin}
755707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
75669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
75769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2
75869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android
759