CaptureSequencer.cpp revision 69230df9905534cda15becd44c0109874c4be5f0
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
1769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define LOG_TAG "Camera2Client::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"
2669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Device.h"
2769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Client.h"
2869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Parameters.h"
2969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android {
3169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 {
3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */
3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client):
3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Thread(false),
3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture(false),
3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy(false),
3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState(false),
4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived(false),
4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived(false),
4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mClient(client),
4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureState(IDLE),
4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId(0),
4569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTimeoutCount(0),
4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureId(Camera2Client::kFirstCaptureRequestId) {
4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
4869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
4969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() {
5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
5169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) {
5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mZslProcessor = processor;
5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() {
5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mBusy) {
6269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Already busy capturing!", __FUNCTION__);
6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
6569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mStartCapture) {
6669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = true;
6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCaptureSignal.signal();
6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) {
7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAEState = newState;
7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAETriggerId = triggerId;
7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewAEState) {
7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = true;
7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewNotifySignal.signal();
8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
8169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
8269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
8369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId,
8469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CameraMetadata &frame) {
8569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
8669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
8769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrameId = frameId;
8869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrame.acquire(frame);
8969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewFrameReceived) {
9069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = true;
9169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameSignal.signal();
9269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
9369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
9469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
9569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp) {
9669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
9769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureTimestamp = timestamp;
9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewCaptureReceived) {
10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = true;
10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureSignal.signal();
10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) {
10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    String8 result;
10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request:\n";
11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request: undefined\n";
11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result = String8::format("    Current capture state: %s\n",
11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            kStateNames[mCaptureState]);
11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.append("    Latest captured frame:\n");
11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    write(fd, result.string(), result.size());
12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrame.dump(fd, 2, 6);
12169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */
12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] =
12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{
12769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "IDLE",
12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "START",
12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_START",
13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_WAITING",
13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_REPROCESSING",
13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_START",
13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_PRECAPTURE",
13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_CAPTURING",
13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "DONE",
13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ERROR",
13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "UNKNOWN"
13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager
14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageIdle,
14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStart,
14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslStart,
14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslWaiting,
14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslReprocessing,
14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardStart,
14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardPrecaptureWait,
14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCapture,
15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCaptureWait,
15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageDone,
15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() {
15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<Camera2Client> client = mClient.promote();
15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (client == 0) return false;
15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
16069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureState < ERROR) {
16169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureState = (this->*kStateManagers[mCaptureState])(client);
16269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
16369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Bad capture state: %s",
16469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, kStateNames[mCaptureState]);
16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return false;
16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return true;
16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) {
17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mStartCapture) {
17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mStartCaptureSignal.waitRelative(mInputMutex,
17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                kWaitDuration);
17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) break;
17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mStartCapture) {
18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = false;
18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = true;
18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return START;
18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) {
18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureId++;
19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
19369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
19469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Mutex::Autolock l(mInputMutex);
19569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = false;
19669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
19769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
19869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
19969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    switch (l.mParameters.state) {
20069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::STILL_CAPTURE:
20169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            l.mParameters.state = Parameters::STOPPED;
20269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
20369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::VIDEO_SNAPSHOT:
20469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            l.mParameters.state = Parameters::RECORD;
20569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
20669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        default:
20769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly "
20869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    "in state %s!",
20969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(),
21069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    Parameters::getStateName(l.mParameters.state));
21169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
21269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
21369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
21469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
21569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
21669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart(
21769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
21869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
21969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
22069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
22169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CaptureState nextState = DONE;
22269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
22369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = updateCaptureRequest(l.mParameters, client);
22469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK ) {
22569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)",
22669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
22769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
22869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
22969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
23069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.zslMode &&
23169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE) {
23269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = ZSL_START;
23369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = STANDARD_START;
23569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
23669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
23769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return nextState;
23869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
23969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
24069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart(
24169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
24369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (processor == 0) {
24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: No ZSL queue to use!", __FUNCTION__);
24669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
24769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
24869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->registerFrameListener(mCaptureId,
25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            this);
25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = client->getCameraDevice()->clearStreamingRequest();
25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
25469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: "
25569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "%s (%d)",
25669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
25769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
25869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
25969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Actually select the right thing here.
26069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    processor->pushToReprocess(mCaptureId);
26169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
26269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
26369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
26469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
26569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
26669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting(
26769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
26869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return DONE;
26969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
27069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
27169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing(
27269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
27369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return START;
27469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
27569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
27669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
27769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
27869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
27969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->registerFrameListener(mCaptureId,
28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            this);
28169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
28369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId = l.mParameters.precaptureTriggerCounter++;
28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId);
28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAeInPrecapture = false;
28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForPrecaptureStart;
28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait(
29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewAEState) {
29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration);
29969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
30069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
30169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
30269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
30369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
30469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
30569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for precapture %s",
30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture ? "end" : "start");
30769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return STANDARD_CAPTURE;
30869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewAEState) {
31069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (!mAeInPrecapture) {
31169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state
31269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
31369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture start", __FUNCTION__);
31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture = true;
31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mTimeoutCount = kMaxTimeoutsForPrecaptureEnd;
31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state end
32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture end", __FUNCTION__);
32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                return STANDARD_CAPTURE;
32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = false;
32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
32869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Vector<uint8_t> outputStreams;
33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getPreviewStreamId());
33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getCaptureStreamId());
34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.previewCallbackFlags &
34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getCallbackStreamId());
34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getRecordingStreamId());
34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            outputStreams);
35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
35369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(ANDROID_REQUEST_ID,
35469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureId, 1);
35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.sort();
35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
35969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
36069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
36269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
36569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
36669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
36769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
36869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
36969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId());
37069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::STILL_CAPTURE) {
37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = client->getCameraDevice()->clearStreamingRequest();
37569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    "%s (%d)",
37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return DONE;
38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = client->getCameraDevice()->capture(captureCopy);
38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "%s (%d)",
38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait(
39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewFrameReceived) {
40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration);
40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewCaptureReceived) {
40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for capture to complete");
41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
41869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewFrameReceived && mNewCaptureReceived) {
41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (mNewFrameId != mCaptureId) {
42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture frame IDs: Expected %d, got %d",
42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mCaptureId, mNewFrameId);
42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        camera_metadata_entry_t entry;
42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP);
42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.count == 0) {
42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("No timestamp field in capture frame!");
42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.data.i64[0] != mCaptureTimestamp) {
42969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture timestamps: Metadata frame %lld,"
43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp);
43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        client->removeFrameListener(mCaptureId);
43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = false;
43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = false;
43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters &params,
44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = client->getCameraDevice()->createDefaultRequest(
44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                CAMERA2_TEMPLATE_STILL_CAPTURE,
44869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureRequest);
44969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, client->getCameraId(),
45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    strerror(-res), res);
45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return res;
45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = params.updateRequest(&mCaptureRequest);
45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                strerror(-res), res);
46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return res;
46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE,
46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            params.jpegThumbSize, 2);
46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
46969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &params.jpegThumbQuality, 1);
47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_QUALITY,
47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &params.jpegQuality, 1);
47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(
47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &params.jpegRotation, 1);
47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
47969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (params.gpsEnabled) {
48069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(
48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
48269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                params.gpsCoordinates, 3);
48369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
48469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(
48569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
48669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &params.gpsTimestamp, 1);
48769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
48869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(
48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                params.gpsProcessingMethod);
49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES);
49469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
49569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP);
49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
49769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
49869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
49969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
50069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
50169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
50269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
50369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
50469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
50569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2
50669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android
507