CaptureSequencer.cpp revision ad21da9c2b575eddc0d11b789bb577985a0bf50b
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
2169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Log.h>
2269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Trace.h>
2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Vector.h>
2469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "CaptureSequencer.h"
26c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "BurstCapture.h"
2769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Device.h"
2869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Client.h"
2969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Parameters.h"
3069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android {
3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 {
3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */
3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client):
3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Thread(false),
3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture(false),
3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy(false),
4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState(false),
4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived(false),
4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived(false),
43ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        mShutterNotified(false),
4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mClient(client),
4569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureState(IDLE),
4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId(0),
4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTimeoutCount(0),
484c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        mCaptureId(Camera2Client::kCaptureRequestIdStart) {
49c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() {
5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) {
5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mZslProcessor = processor;
5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() {
62c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
6569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mBusy) {
6669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Already busy capturing!", __FUNCTION__);
6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mStartCapture) {
7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = true;
7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCaptureSignal.signal();
7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
76e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) {
77e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ATRACE_CALL();
78e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ALOGV("%s: Waiting for idle", __FUNCTION__);
79e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    Mutex::Autolock l(mStateMutex);
80e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    status_t res = -1;
81e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    while (mCaptureState != IDLE) {
82e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        nsecs_t startTime = systemTime();
83e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
84e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        res = mStateChanged.waitRelative(mStateMutex, timeout);
85e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        if (res != OK) return res;
86e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
87e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        timeout -= (systemTime() - startTime);
88e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
89e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    ALOGV("%s: Now idle", __FUNCTION__);
90e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    return OK;
91e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala}
92e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
9369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) {
9469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
9569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
9669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAEState = newState;
9769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAETriggerId = triggerId;
9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewAEState) {
9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = true;
10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewNotifySignal.signal();
10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId,
1054c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        const CameraMetadata &frame) {
106c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s: Listener found new frame", __FUNCTION__);
10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrameId = frameId;
1104c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    mNewFrame = frame;
11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewFrameReceived) {
11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = true;
11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameSignal.signal();
11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp,
11852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        sp<MemoryBase> captureBuffer) {
11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
120c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
12169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureTimestamp = timestamp;
12352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer = captureBuffer;
12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewCaptureReceived) {
12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = true;
12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureSignal.signal();
12769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) {
13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    String8 result;
13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request:\n";
13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request: undefined\n";
13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result = String8::format("    Current capture state: %s\n",
14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            kStateNames[mCaptureState]);
14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.append("    Latest captured frame:\n");
14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    write(fd, result.string(), result.size());
14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrame.dump(fd, 2, 6);
14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */
14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] =
15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{
15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "IDLE",
15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "START",
15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_START",
15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_WAITING",
15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_REPROCESSING",
15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_START",
158e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_PRECAPTURE_WAIT",
159e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_CAPTURE",
160e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    "STANDARD_CAPTURE_WAIT",
161c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    "BURST_CAPTURE_START",
162c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    "BURST_CAPTURE_WAIT",
16369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "DONE",
16469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ERROR",
16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "UNKNOWN"
16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager
16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageIdle,
17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStart,
17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslStart,
17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslWaiting,
17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslReprocessing,
17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardStart,
17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardPrecaptureWait,
17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCapture,
17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCaptureWait,
179c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    &CaptureSequencer::manageBurstCaptureStart,
180c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    &CaptureSequencer::manageBurstCaptureWait,
18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageDone,
18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() {
18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<Camera2Client> client = mClient.promote();
18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (client == 0) return false;
18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
190e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    CaptureState currentState;
191e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    {
192e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        Mutex::Autolock l(mStateMutex);
193e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        currentState = mCaptureState;
194e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
195e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
196e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    currentState = (this->*kStateManagers[currentState])(client);
197e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
198e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    Mutex::Autolock l(mStateMutex);
199e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    if (currentState != mCaptureState) {
200e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        mCaptureState = currentState;
201e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        ATRACE_INT("cam2_capt_state", mCaptureState);
202e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        ALOGV("Camera %d: New capture state %s",
203e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                client->getCameraId(), kStateNames[mCaptureState]);
204e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        mStateChanged.signal();
205e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    }
206e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala
207e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala    if (mCaptureState == ERROR) {
208e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala        ALOGE("Camera %d: Stopping capture sequencer due to error",
209e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                client->getCameraId());
21069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return false;
21169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
21269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
21369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return true;
21469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
21569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
21669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) {
21769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
21869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
21969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mStartCapture) {
22069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mStartCaptureSignal.waitRelative(mInputMutex,
22169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                kWaitDuration);
22269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) break;
22369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
22469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mStartCapture) {
22569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = false;
22669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = true;
22769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return START;
22869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
22969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
23069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
23169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
23269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) {
23352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    status_t res = OK;
23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
23569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureId++;
2364c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) {
2374c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        mCaptureId = Camera2Client::kCaptureRequestIdStart;
2384c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    }
23969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
24069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Mutex::Autolock l(mInputMutex);
24169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = false;
24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
24369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
24452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    {
24552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
24652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        switch (l.mParameters.state) {
247e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala            case Parameters::DISCONNECTED:
248e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                ALOGW("%s: Camera %d: Discarding image data during shutdown ",
249e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                        __FUNCTION__, client->getCameraId());
250e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                res = INVALID_OPERATION;
251e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala                break;
25252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
25352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
25452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
25552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
25652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
25752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
25852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            default:
25952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                ALOGE("%s: Camera %d: Still image produced unexpectedly "
26052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        "in state %s!",
26152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        __FUNCTION__, client->getCameraId(),
26252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        Parameters::getStateName(l.mParameters.state));
26352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                res = INVALID_OPERATION;
26452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
26552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    }
2665a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
2675a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    if (processor != 0) {
2685a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala        processor->clearZslQueue();
2695a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    }
2705a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala
27152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    if (mCaptureBuffer != 0 && res == OK) {
27252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient);
27352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        ALOGV("%s: Sending still image to client", __FUNCTION__);
27452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        if (l.mCameraClient != 0) {
27552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
27652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                    mCaptureBuffer, NULL);
27752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        } else {
27852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            ALOGV("%s: No client!", __FUNCTION__);
27952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
28152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer.clear();
28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart(
28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
288c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CaptureState nextState = DONE;
29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = updateCaptureRequest(l.mParameters, client);
29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK ) {
29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)",
29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
29969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
30069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
301c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE &&
302c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            l.mParameters.state == Parameters::STILL_CAPTURE) {
303c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        nextState = BURST_CAPTURE_START;
304c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
305c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    else if (l.mParameters.zslMode &&
3065a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE &&
3075a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.flashMode != Parameters::FLASH_MODE_ON) {
30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = ZSL_START;
30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = STANDARD_START;
31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
312ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    mShutterNotified = false;
31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return nextState;
31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart(
31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
3192954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (processor == 0) {
32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: No ZSL queue to use!", __FUNCTION__);
32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3274c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
32869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            this);
32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Actually select the right thing here.
3312954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    res = processor->pushToReprocess(mCaptureId);
3322954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    if (res != OK) {
3332274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        if (res == NOT_ENOUGH_DATA) {
3342274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, "
3352274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    "falling back to normal capture", __FUNCTION__,
3362274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    client->getCameraId());
3372274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        } else {
3382274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)",
3392274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
3402274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        }
3412954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala        return STANDARD_START;
3422954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    }
34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
344a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
345707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    /* warning: this also locks a SharedCameraClient */
346707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    shutterNotifyLocked(l.mParameters, client);
347ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    mShutterNotified = true;
34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting(
35369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
3542954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return DONE;
35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing(
35969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
3602954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return START;
36269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
36569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
36669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
3674c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala    client->registerFrameListener(mCaptureId, mCaptureId + 1,
36869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            this);
36969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
37069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId = l.mParameters.precaptureTriggerCounter++;
37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId);
37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
37569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAeInPrecapture = false;
37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForPrecaptureStart;
37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait(
38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewAEState) {
38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration);
38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for precapture %s",
39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture ? "end" : "start");
39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return STANDARD_CAPTURE;
39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewAEState) {
39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (!mAeInPrecapture) {
39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state
40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture start", __FUNCTION__);
40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture = true;
40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mTimeoutCount = kMaxTimeoutsForPrecaptureEnd;
40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state end
40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture end", __FUNCTION__);
41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                return STANDARD_CAPTURE;
41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = false;
41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
41869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Vector<uint8_t> outputStreams;
42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getPreviewStreamId());
42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getCaptureStreamId());
42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.previewCallbackFlags &
43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getCallbackStreamId());
43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getRecordingStreamId());
43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            outputStreams);
44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(ANDROID_REQUEST_ID,
44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureId, 1);
44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.sort();
44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
44869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
44969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId());
45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::STILL_CAPTURE) {
4624c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        res = client->stopStream();
46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    "%s (%d)",
46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return DONE;
46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
46969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = client->getCameraDevice()->capture(captureCopy);
47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "%s (%d)",
47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
47969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
48069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
48269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
48369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait(
48469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
48569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
48669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
48769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
48869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewFrameReceived) {
48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration);
49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
49469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
495ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    if (mNewFrameReceived && !mShutterNotified) {
496ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
497ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        /* warning: this also locks a SharedCameraClient */
498ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        shutterNotifyLocked(l.mParameters, client);
499ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala        mShutterNotified = true;
500ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    }
501ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala    while (mNewFrameReceived && !mNewCaptureReceived) {
50269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
50369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
50469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
50569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
50669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
50769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
50869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
50969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for capture to complete");
51069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
51169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
51269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewFrameReceived && mNewCaptureReceived) {
51369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (mNewFrameId != mCaptureId) {
51469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture frame IDs: Expected %d, got %d",
51569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mCaptureId, mNewFrameId);
51669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
51769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        camera_metadata_entry_t entry;
51869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP);
51969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.count == 0) {
52069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("No timestamp field in capture frame!");
52169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
52269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.data.i64[0] != mCaptureTimestamp) {
52369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture timestamps: Metadata frame %lld,"
52469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp);
52569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
5264c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala        client->removeFrameListener(mCaptureId, mCaptureId + 1, this);
52769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
52869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = false;
52969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = false;
53069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
53169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
53269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
53369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
53469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
535c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart(
536c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        sp<Camera2Client> &client) {
537c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
538c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    status_t res;
539c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ATRACE_CALL();
540c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
541c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    // check which burst mode is set, create respective burst object
542c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    {
543c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        SharedParameters::Lock l(client->getParameters());
544c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
545c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = updateCaptureRequest(l.mParameters, client);
546c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        if(res != OK) {
547c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            return DONE;
548c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        }
549c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
550c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        //
551c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        // check for burst mode type in mParameters here
552c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        //
553c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        mBurstCapture = new BurstCapture(client, this);
554c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
555c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
556c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1);
557c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (res == OK) {
558c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = mCaptureRequest.sort();
559c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
560c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (res != OK) {
561c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
562c3dbf1a40df85b75e5805382838a90416f69730fJames Painter                __FUNCTION__, client->getCameraId(), strerror(-res), res);
563c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
564c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
565c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
566c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    CameraMetadata captureCopy = mCaptureRequest;
567c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (captureCopy.entryCount() == 0) {
568c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
569c3dbf1a40df85b75e5805382838a90416f69730fJames Painter                __FUNCTION__, client->getCameraId());
570c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
571c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
572c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
573c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    Vector<CameraMetadata> requests;
574c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    requests.push(mCaptureRequest);
575c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    res = mBurstCapture->start(requests, mCaptureId);
576c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10;
577c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return BURST_CAPTURE_WAIT;
578c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
579c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
580c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait(
581c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        sp<Camera2Client> &client) {
582c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    status_t res;
583c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ATRACE_CALL();
584c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
585c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    while (!mNewCaptureReceived) {
586c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
587c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        if (res == TIMED_OUT) {
588c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            mTimeoutCount--;
589c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            break;
590c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        }
591c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
592c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
593c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (mTimeoutCount <= 0) {
594c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGW("Timed out waiting for burst capture to complete");
595c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
596c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
597c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (mNewCaptureReceived) {
598c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        mNewCaptureReceived = false;
599c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        // TODO: update mCaptureId to last burst's capture ID + 1?
600c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
601c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
602c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
603c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return BURST_CAPTURE_WAIT;
604c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
605c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
60669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters &params,
60769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
60869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
60969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
61069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
61169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = client->getCameraDevice()->createDefaultRequest(
61269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                CAMERA2_TEMPLATE_STILL_CAPTURE,
61369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureRequest);
61469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
61569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
61669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, client->getCameraId(),
61769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    strerror(-res), res);
61869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return res;
61969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
62069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
62169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
62269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = params.updateRequest(&mCaptureRequest);
62369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
62469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
62569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
62669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                strerror(-res), res);
62769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return res;
62869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
62969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
630db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    res = params.updateRequestJpeg(&mCaptureRequest);
631db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (res != OK) {
632db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update JPEG entries of capture "
633db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
634db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                strerror(-res), res);
635db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        return res;
63669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
63769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
63869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
63969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
64069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
641707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters &params,
642707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            sp<Camera2Client> client) {
643707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    ATRACE_CALL();
644707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
645707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    if (params.state == Parameters::STILL_CAPTURE && params.playShutterSound) {
646707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
647707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    }
648707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
649707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    {
650707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient);
651707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
652707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        ALOGV("%s: Notifying of shutter close to client", __FUNCTION__);
653707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        if (l.mCameraClient != 0) {
654707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            // ShutterCallback
655707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            l.mCameraClient->notifyCallback(CAMERA_MSG_SHUTTER,
656707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
657707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
658707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            // RawCallback with null buffer
659707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            l.mCameraClient->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY,
660707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin                                            /*ext1*/0, /*ext2*/0);
661707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        } else {
662707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin            ALOGV("%s: No client!", __FUNCTION__);
663707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin        }
664707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin    }
665707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin}
666707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin
66769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
66869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2
66969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android
670