CaptureSequencer.cpp revision 5a07a62123d3e630d739e790528273c1c09e3490
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"
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),
4369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mClient(client),
4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureState(IDLE),
4569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId(0),
4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTimeoutCount(0),
4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureId(Camera2Client::kFirstCaptureRequestId) {
48c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
4969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() {
5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ALOGV("%s: Exit", __FUNCTION__);
5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) {
5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mZslProcessor = processor;
5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::startCapture() {
61c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
6269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
6369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mBusy) {
6569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Already busy capturing!", __FUNCTION__);
6669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return INVALID_OPERATION;
6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mStartCapture) {
6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = true;
7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCaptureSignal.signal();
7169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) {
7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
7869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAEState = newState;
7969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAETriggerId = triggerId;
8069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewAEState) {
8169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = true;
8269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewNotifySignal.signal();
8369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
8469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
8569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
8669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId,
8769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CameraMetadata &frame) {
88c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s: Listener found new frame", __FUNCTION__);
8969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
9069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
9169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrameId = frameId;
9269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrame.acquire(frame);
9369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewFrameReceived) {
9469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = true;
9569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameSignal.signal();
9669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
9769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
9952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp,
10052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        sp<MemoryBase> captureBuffer) {
10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
102c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureTimestamp = timestamp;
10552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer = captureBuffer;
10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (!mNewCaptureReceived) {
10769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = true;
10869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureSignal.signal();
10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::dump(int fd, const Vector<String16>& args) {
11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    String8 result;
11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() != 0) {
11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request:\n";
11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureRequest.dump(fd, 2, 6);
11969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
12069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        result = "    Capture request: undefined\n";
12169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        write(fd, result.string(), result.size());
12269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result = String8::format("    Current capture state: %s\n",
12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            kStateNames[mCaptureState]);
12569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    result.append("    Latest captured frame:\n");
12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    write(fd, result.string(), result.size());
12769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mNewFrame.dump(fd, 2, 6);
12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */
13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] =
13369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{
13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "IDLE",
13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "START",
13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_START",
13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_WAITING",
13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ZSL_REPROCESSING",
13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_START",
14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_PRECAPTURE",
14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "STANDARD_CAPTURING",
142c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    "BURST_CAPTURE_START",
143c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    "BURST_CAPTURE_WAIT",
14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "DONE",
14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "ERROR",
14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    "UNKNOWN"
14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager
15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = {
15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageIdle,
15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStart,
15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslStart,
15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslWaiting,
15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageZslReprocessing,
15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardStart,
15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardPrecaptureWait,
15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCapture,
15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageStandardCaptureWait,
160c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    &CaptureSequencer::manageBurstCaptureStart,
161c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    &CaptureSequencer::manageBurstCaptureWait,
16269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    &CaptureSequencer::manageDone,
16369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala};
16469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() {
16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<Camera2Client> client = mClient.promote();
16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (client == 0) return false;
17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureState < ERROR) {
17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mCaptureState = (this->*kStateManagers[mCaptureState])(client);
17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Bad capture state: %s",
17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, kStateNames[mCaptureState]);
17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return false;
17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return true;
18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
18169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) {
18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mStartCapture) {
18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mStartCaptureSignal.waitRelative(mInputMutex,
18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                kWaitDuration);
18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) break;
19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
19169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mStartCapture) {
19269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mStartCapture = false;
19369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = true;
19469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return START;
19569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
19669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
19769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
19869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
19969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) {
20052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    status_t res = OK;
20169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
20269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mCaptureId++;
20369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
20469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
20569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        Mutex::Autolock l(mInputMutex);
20669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mBusy = false;
20769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
20869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
20952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    {
21052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
21152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        switch (l.mParameters.state) {
21252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::STILL_CAPTURE:
21352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::STOPPED;
21452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
21552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            case Parameters::VIDEO_SNAPSHOT:
21652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                l.mParameters.state = Parameters::RECORD;
21752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                break;
21852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            default:
21952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                ALOGE("%s: Camera %d: Still image produced unexpectedly "
22052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        "in state %s!",
22152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        __FUNCTION__, client->getCameraId(),
22252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                        Parameters::getStateName(l.mParameters.state));
22352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                res = INVALID_OPERATION;
22452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
22552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    }
2265a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
2275a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    if (processor != 0) {
2285a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala        processor->clearZslQueue();
2295a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala    }
2305a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala
23152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    if (mCaptureBuffer != 0 && res == OK) {
23252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient);
23352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        ALOGV("%s: Sending still image to client", __FUNCTION__);
23452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        if (l.mCameraClient != 0) {
23552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
23652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala                    mCaptureBuffer, NULL);
23752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        } else {
23852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala            ALOGV("%s: No client!", __FUNCTION__);
23952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala        }
24069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
24152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala    mCaptureBuffer.clear();
24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
24369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return IDLE;
24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
24669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart(
24769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
248c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
24969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
25069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
25169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
25269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CaptureState nextState = DONE;
25369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
25469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = updateCaptureRequest(l.mParameters, client);
25569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK ) {
25669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)",
25769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
25869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
25969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
26069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
261c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE &&
262c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            l.mParameters.state == Parameters::STILL_CAPTURE) {
263c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        nextState = BURST_CAPTURE_START;
264c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
265c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    else if (l.mParameters.zslMode &&
2665a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE &&
2675a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala            l.mParameters.flashMode != Parameters::FLASH_MODE_ON) {
26869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = ZSL_START;
26969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
27069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        nextState = STANDARD_START;
27169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
27269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
27369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return nextState;
27469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
27569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
27669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart(
27769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
2782954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
27969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
28069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    sp<ZslProcessor> processor = mZslProcessor.promote();
28169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (processor == 0) {
28269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: No ZSL queue to use!", __FUNCTION__);
28369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
28469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
28569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->registerFrameListener(mCaptureId,
28769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            this);
28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = client->getCameraDevice()->clearStreamingRequest();
29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to stop preview for ZSL capture: "
29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "%s (%d)",
29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
29469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Actually select the right thing here.
2972954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    res = processor->pushToReprocess(mCaptureId);
2982954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    if (res != OK) {
2992274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        if (res == NOT_ENOUGH_DATA) {
3002274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, "
3012274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    "falling back to normal capture", __FUNCTION__,
3022274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    client->getCameraId());
3032274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        } else {
3042274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala            ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)",
3052274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
3062274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala        }
3072954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala        return STANDARD_START;
3082954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    }
30969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
310a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
311a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala    if (l.mParameters.playShutterSound) {
312a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
313a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala    }
314a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala
31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
31869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting(
32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
3212954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return DONE;
32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
32569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing(
32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
3272954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala    ALOGV("%s", __FUNCTION__);
32869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return START;
32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
33369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->registerFrameListener(mCaptureId,
33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            this);
33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    {
33769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        SharedParameters::Lock l(client->getParameters());
33869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mTriggerId = l.mParameters.precaptureTriggerCounter++;
33969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
34069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId);
34169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mAeInPrecapture = false;
34369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForPrecaptureStart;
34469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
34569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
34669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
34769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait(
34869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
35069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
35169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
35269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewAEState) {
35369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration);
35469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
35969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
36069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for precapture %s",
36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture ? "end" : "start");
36269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return STANDARD_CAPTURE;
36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewAEState) {
36569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (!mAeInPrecapture) {
36669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state
36769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
36869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
36969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture start", __FUNCTION__);
37069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mAeInPrecapture = true;
37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                mTimeoutCount = kMaxTimeoutsForPrecaptureEnd;
37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
37369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
37469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            // Waiting to see PRECAPTURE state end
37569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            if (mAETriggerId == mTriggerId &&
37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) {
37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ALOGV("%s: Got precapture end", __FUNCTION__);
37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                return STANDARD_CAPTURE;
37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            }
38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewAEState = false;
38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_PRECAPTURE_WAIT;
38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
38969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    SharedParameters::Lock l(client->getParameters());
39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Vector<uint8_t> outputStreams;
39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getPreviewStreamId());
39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    outputStreams.push(client->getCaptureStreamId());
39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.previewCallbackFlags &
39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getCallbackStreamId());
39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) {
40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        outputStreams.push(client->getRecordingStreamId());
40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS,
40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            outputStreams);
40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(ANDROID_REQUEST_ID,
40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureId, 1);
41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res == OK) {
41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.sort();
41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
41869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    CameraMetadata captureCopy = mCaptureRequest;
42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (captureCopy.entryCount() == 0) {
42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId());
42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (l.mParameters.state == Parameters::STILL_CAPTURE) {
42969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = client->getCameraDevice()->clearStreamingRequest();
43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    "%s (%d)",
43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    __FUNCTION__, client->getCameraId(), strerror(-res), res);
43469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return DONE;
43569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
43669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
43769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
43869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = client->getCameraDevice()->capture(captureCopy);
43969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
44069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "%s (%d)",
44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                __FUNCTION__, client->getCameraId(), strerror(-res), res);
44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
446bd3a81653a9bbdf7aa9394d99f2fc9b7dabf68dcEino-Ville Talvala    if (l.mParameters.playShutterSound &&
447bd3a81653a9bbdf7aa9394d99f2fc9b7dabf68dcEino-Ville Talvala            l.mParameters.state == Parameters::STILL_CAPTURE) {
44833578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala        client->getCameraService()->playSound(CameraService::SOUND_SHUTTER);
44933578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala    }
45033578836f930024306fb2a173d7da36d7f3d7dbfEino-Ville Talvala
45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    mTimeoutCount = kMaxTimeoutsForCaptureEnd;
45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait(
45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    Mutex::Autolock l(mInputMutex);
46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewFrameReceived) {
46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration);
46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    while (!mNewCaptureReceived) {
46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
46969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res == TIMED_OUT) {
47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            mTimeoutCount--;
47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mTimeoutCount <= 0) {
47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGW("Timed out waiting for capture to complete");
47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
47769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
47869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mNewFrameReceived && mNewCaptureReceived) {
47969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (mNewFrameId != mCaptureId) {
48069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture frame IDs: Expected %d, got %d",
48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    mCaptureId, mNewFrameId);
48269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
48369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        camera_metadata_entry_t entry;
48469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP);
48569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.count == 0) {
48669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("No timestamp field in capture frame!");
48769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
48869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (entry.data.i64[0] != mCaptureTimestamp) {
48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGW("Mismatched capture timestamps: Metadata frame %lld,"
49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp);
49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        client->removeFrameListener(mCaptureId);
49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
49469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewFrameReceived = false;
49569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        mNewCaptureReceived = false;
49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return DONE;
49769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
49869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return STANDARD_CAPTURE_WAIT;
49969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
50069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
501c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart(
502c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        sp<Camera2Client> &client) {
503c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ALOGV("%s", __FUNCTION__);
504c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    status_t res;
505c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ATRACE_CALL();
506c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
507c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    // check which burst mode is set, create respective burst object
508c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    {
509c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        SharedParameters::Lock l(client->getParameters());
510c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
511c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = updateCaptureRequest(l.mParameters, client);
512c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        if(res != OK) {
513c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            return DONE;
514c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        }
515c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
516c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        //
517c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        // check for burst mode type in mParameters here
518c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        //
519c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        mBurstCapture = new BurstCapture(client, this);
520c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
521c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
522c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1);
523c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (res == OK) {
524c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = mCaptureRequest.sort();
525c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
526c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (res != OK) {
527c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)",
528c3dbf1a40df85b75e5805382838a90416f69730fJames Painter                __FUNCTION__, client->getCameraId(), strerror(-res), res);
529c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
530c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
531c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
532c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    CameraMetadata captureCopy = mCaptureRequest;
533c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (captureCopy.entryCount() == 0) {
534c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
535c3dbf1a40df85b75e5805382838a90416f69730fJames Painter                __FUNCTION__, client->getCameraId());
536c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
537c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
538c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
539c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    Vector<CameraMetadata> requests;
540c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    requests.push(mCaptureRequest);
541c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    res = mBurstCapture->start(requests, mCaptureId);
542c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10;
543c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return BURST_CAPTURE_WAIT;
544c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
545c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
546c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait(
547c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        sp<Camera2Client> &client) {
548c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    status_t res;
549c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    ATRACE_CALL();
550c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
551c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    while (!mNewCaptureReceived) {
552c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration);
553c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        if (res == TIMED_OUT) {
554c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            mTimeoutCount--;
555c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            break;
556c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        }
557c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
558c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
559c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (mTimeoutCount <= 0) {
560c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        ALOGW("Timed out waiting for burst capture to complete");
561c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
562c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
563c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    if (mNewCaptureReceived) {
564c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        mNewCaptureReceived = false;
565c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        // TODO: update mCaptureId to last burst's capture ID + 1?
566c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        return DONE;
567c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    }
568c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
569c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return BURST_CAPTURE_WAIT;
570c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
571c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
57269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters &params,
57369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        sp<Camera2Client> &client) {
57469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
57569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
57669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (mCaptureRequest.entryCount() == 0) {
57769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = client->getCameraDevice()->createDefaultRequest(
57869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                CAMERA2_TEMPLATE_STILL_CAPTURE,
57969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &mCaptureRequest);
58069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) {
58169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
58269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, client->getCameraId(),
58369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    strerror(-res), res);
58469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return res;
58569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
58669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
58769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
58869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = params.updateRequest(&mCaptureRequest);
58969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) {
59069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
59169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                "request: %s (%d)", __FUNCTION__, client->getCameraId(),
59269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                strerror(-res), res);
59369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        return res;
59469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
59569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
59669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_SIZE,
59769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            params.jpegThumbSize, 2);
59869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
59969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_THUMBNAIL_QUALITY,
60069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &params.jpegThumbQuality, 1);
60169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
60269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(ANDROID_JPEG_QUALITY,
60369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &params.jpegQuality, 1);
60469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
60569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = mCaptureRequest.update(
60669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
60769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &params.jpegRotation, 1);
60869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
60969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
61069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (params.gpsEnabled) {
61169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(
61269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
61369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                params.gpsCoordinates, 3);
61469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
61569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(
61669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
61769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &params.gpsTimestamp, 1);
61869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
61969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.update(
62069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
62169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                params.gpsProcessingMethod);
62269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
62369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
62469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_COORDINATES);
62569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
62669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_TIMESTAMP);
62769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
62869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = mCaptureRequest.erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
62969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
63069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
63169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
63269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
63369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
63469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
63569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
63669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2
63769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android
638