CaptureSequencer.cpp revision 4d2f2e8414df33337d4f09e5235719dfcc705674
169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/* 269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project 369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * you may not use this file except in compliance with the License. 669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * You may obtain a copy of the License at 769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * 1069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 1169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 1269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * See the License for the specific language governing permissions and 1469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala * limitations under the License. 1569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala */ 1669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define LOG_TAG "Camera2-CaptureSequencer" 1869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 1969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala//#define LOG_NDEBUG 0 2069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 2169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Log.h> 2269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Trace.h> 2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Vector.h> 2469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "CaptureSequencer.h" 26c3dbf1a40df85b75e5805382838a90416f69730fJames Painter#include "BurstCapture.h" 2769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Device.h" 2869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "../Camera2Client.h" 2969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include "Parameters.h" 3069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace android { 3269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalanamespace camera2 { 3369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Public members */ 3569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3669230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureSequencer(wp<Camera2Client> client): 3769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Thread(false), 3869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture(false), 3969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy(false), 4069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState(false), 4169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived(false), 4269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived(false), 43ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified(false), 4469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mClient(client), 4569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureState(IDLE), 4669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId(0), 4769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount(0), 48786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mCaptureId(Camera2Client::kCaptureRequestIdStart), 49786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mMsgType(0) { 50c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 5169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::~CaptureSequencer() { 5469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Exit", __FUNCTION__); 5569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 5669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 5769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) { 5869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 5969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mZslProcessor = processor; 6069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 6169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 62786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkinstatus_t CaptureSequencer::startCapture(int msgType) { 63c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 6469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 6569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 6669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mBusy) { 6769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Already busy capturing!", __FUNCTION__); 6869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return INVALID_OPERATION; 6969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mStartCapture) { 71786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin mMsgType = msgType; 7269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = true; 7369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCaptureSignal.signal(); 7469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 7569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 7669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 7769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 78e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvalastatus_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) { 79e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ATRACE_CALL(); 80e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("%s: Waiting for idle", __FUNCTION__); 81e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 82e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala status_t res = -1; 83e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala while (mCaptureState != IDLE) { 84e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala nsecs_t startTime = systemTime(); 85e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 86e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala res = mStateChanged.waitRelative(mStateMutex, timeout); 87e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (res != OK) return res; 88e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 89e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala timeout -= (systemTime() - startTime); 90e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 91e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("%s: Now idle", __FUNCTION__); 92e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala return OK; 93e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala} 94e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 9569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) { 9669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 9769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 9869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState = newState; 9969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAETriggerId = triggerId; 10069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewAEState) { 10169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = true; 10269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewNotifySignal.signal(); 10369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 10469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 10569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 10669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalavoid CaptureSequencer::onFrameAvailable(int32_t frameId, 1074c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala const CameraMetadata &frame) { 108c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s: Listener found new frame", __FUNCTION__); 10969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 11069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 11169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameId = frameId; 1124c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mNewFrame = frame; 11369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewFrameReceived) { 11469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = true; 11569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameSignal.signal(); 11669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 11769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 11869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 11952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvalavoid CaptureSequencer::onCaptureAvailable(nsecs_t timestamp, 12052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala sp<MemoryBase> captureBuffer) { 12169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 122c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 12369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 12469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureTimestamp = timestamp; 12552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer = captureBuffer; 12669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mNewCaptureReceived) { 12769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = true; 12869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureSignal.signal(); 12969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 13069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 13169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 13269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 133ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinvoid CaptureSequencer::dump(int fd, const Vector<String16>& /*args*/) { 13469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala String8 result; 13569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() != 0) { 13669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request:\n"; 13769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 13869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureRequest.dump(fd, 2, 6); 13969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 14069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = " Capture request: undefined\n"; 14169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 14269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 14369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result = String8::format(" Current capture state: %s\n", 14469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kStateNames[mCaptureState]); 14569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala result.append(" Latest captured frame:\n"); 14669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala write(fd, result.string(), result.size()); 14769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrame.dump(fd, 2, 6); 14869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 14969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala/** Private members */ 15169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 15269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 15369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala{ 15469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "IDLE", 15569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "START", 15669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_START", 15769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_WAITING", 15869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ZSL_REPROCESSING", 15969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "STANDARD_START", 160e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_PRECAPTURE_WAIT", 161e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_CAPTURE", 162e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala "STANDARD_CAPTURE_WAIT", 163c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_START", 164c3dbf1a40df85b75e5805382838a90416f69730fJames Painter "BURST_CAPTURE_WAIT", 16569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "DONE", 16669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "ERROR", 16769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "UNKNOWN" 16869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 16969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 17069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalaconst CaptureSequencer::StateManager 17169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 17269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageIdle, 17369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStart, 17469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslStart, 17569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslWaiting, 17669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageZslReprocessing, 17769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardStart, 17869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardPrecaptureWait, 17969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCapture, 18069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageStandardCaptureWait, 181c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureStart, 182c3dbf1a40df85b75e5805382838a90416f69730fJames Painter &CaptureSequencer::manageBurstCaptureWait, 18369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &CaptureSequencer::manageDone, 18469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; 18569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalabool CaptureSequencer::threadLoop() { 18769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 18869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> client = mClient.promote(); 18969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (client == 0) return false; 19069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 191e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala CaptureState currentState; 192e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala { 193e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 194e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala currentState = mCaptureState; 195e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 196e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 197e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala currentState = (this->*kStateManagers[currentState])(client); 198e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 199e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala Mutex::Autolock l(mStateMutex); 200e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (currentState != mCaptureState) { 201e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mCaptureState = currentState; 202e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ATRACE_INT("cam2_capt_state", mCaptureState); 203e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGV("Camera %d: New capture state %s", 204e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala client->getCameraId(), kStateNames[mCaptureState]); 205e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala mStateChanged.signal(); 206e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala } 207e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala 208e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala if (mCaptureState == ERROR) { 209e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGE("Camera %d: Stopping capture sequencer due to error", 210e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala client->getCameraId()); 21169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return false; 21269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 21369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 21469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return true; 21569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 21669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 217ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor MurashkinCaptureSequencer::CaptureState CaptureSequencer::manageIdle( 218ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 21969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 22069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 22169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mStartCapture) { 22269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mStartCaptureSignal.waitRelative(mInputMutex, 22369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala kWaitDuration); 22469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) break; 22569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 22669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mStartCapture) { 22769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mStartCapture = false; 22869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = true; 22969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 23069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 23169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 23269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 23369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 23469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 23552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala status_t res = OK; 23669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 23769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId++; 2384c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) { 2394c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala mCaptureId = Camera2Client::kCaptureRequestIdStart; 2404c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala } 24169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 24269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 24369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mBusy = false; 24469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 24569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 24652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala { 24752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 24852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala switch (l.mParameters.state) { 249e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala case Parameters::DISCONNECTED: 250e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala ALOGW("%s: Camera %d: Discarding image data during shutdown ", 251e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala __FUNCTION__, client->getCameraId()); 252e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala res = INVALID_OPERATION; 253e049384cdd0f728c45955d65cae754c46aac18cfEino-Ville Talvala break; 25452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::STILL_CAPTURE: 25552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::STOPPED; 25652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 25752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala case Parameters::VIDEO_SNAPSHOT: 25852e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala l.mParameters.state = Parameters::RECORD; 25952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala break; 26052e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala default: 26152e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGE("%s: Camera %d: Still image produced unexpectedly " 26252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala "in state %s!", 26352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala __FUNCTION__, client->getCameraId(), 26452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala Parameters::getStateName(l.mParameters.state)); 26552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala res = INVALID_OPERATION; 26652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 26752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 2685a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 2695a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala if (processor != 0) { 2705a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala processor->clearZslQueue(); 2715a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala } 2725a8fed0251b978388bcebd6f4d0c4e2773c7641eEino-Ville Talvala 2734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 2744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Fire the jpegCallback in Camera#takePicture(..., jpegCallback) 2754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 27652e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala if (mCaptureBuffer != 0 && res == OK) { 277a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Camera2Client::SharedCameraCallbacks::Lock 278a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l(client->mSharedCameraCallbacks); 27952e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: Sending still image to client", __FUNCTION__); 280a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 281a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 28252e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer, NULL); 28352e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } else { 28452e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala ALOGV("%s: No client!", __FUNCTION__); 28552e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala } 28669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 28752e9ad48ddd3c2e7c90a9002a2a65a5d63125b78Eino-Ville Talvala mCaptureBuffer.clear(); 28869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 28969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return IDLE; 29069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 29169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 29269230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStart( 29369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 294c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 29569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 29669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 29769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 29869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CaptureState nextState = DONE; 29969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 30069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = updateCaptureRequest(l.mParameters, client); 30169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK ) { 30269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 30369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 30469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 30569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 30669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 307c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE && 308c3dbf1a40df85b75e5805382838a90416f69730fJames Painter l.mParameters.state == Parameters::STILL_CAPTURE) { 309c3dbf1a40df85b75e5805382838a90416f69730fJames Painter nextState = BURST_CAPTURE_START; 310c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 311c3dbf1a40df85b75e5805382838a90416f69730fJames Painter else if (l.mParameters.zslMode && 3125a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala l.mParameters.state == Parameters::STILL_CAPTURE && 3135a07a62123d3e630d739e790528273c1c09e3490Eino-Ville Talvala l.mParameters.flashMode != Parameters::FLASH_MODE_ON) { 31469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = ZSL_START; 31569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 31669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala nextState = STANDARD_START; 31769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 318ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = false; 31969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return nextState; 32169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 32269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 32369230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 32469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 3252954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 32669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 32769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<ZslProcessor> processor = mZslProcessor.promote(); 32869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (processor == 0) { 32969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 33069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 33169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 33269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 3334c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 33469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala this); 33569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 33669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Actually select the right thing here. 3372954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala res = processor->pushToReprocess(mCaptureId); 3382954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala if (res != OK) { 3392274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala if (res == NOT_ENOUGH_DATA) { 3402274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 3412274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala "falling back to normal capture", __FUNCTION__, 3422274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala client->getCameraId()); 3432274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } else { 3442274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 3452274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 3462274549ec18f63a285db871fa67abf42124d116eEino-Ville Talvala } 3472954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala return STANDARD_START; 3482954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala } 34969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 350a4247b833599882b23db39e9f773746dc2fd9693Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 351a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin /* warning: this also locks a SharedCameraCallbacks */ 352786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin shutterNotifyLocked(l.mParameters, client, mMsgType); 353ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = true; 35469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 35569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 35669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 35769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 35869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 359ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 3602954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 36169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 36269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 36369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 36469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 365ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 3662954fe9a1cf578c2ad54c2fefb79aeb2a3d220ebEino-Ville Talvala ALOGV("%s", __FUNCTION__); 36769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return START; 36869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 36969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 37069230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 37169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 37269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 3734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 3744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Get the onFrameAvailable callback when the requestID == mCaptureId 3754c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->registerFrameListener(mCaptureId, mCaptureId + 1, 37669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala this); 37769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala { 37869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 37969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTriggerId = l.mParameters.precaptureTriggerCounter++; 38069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 38169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 38269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 38369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = false; 38469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 38569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 38669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 38769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 38869230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 389ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 39069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 39169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 39269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 39369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewAEState) { 39469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 39569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 39669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 39769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 39869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 39969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 40069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 40169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for precapture %s", 40269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture ? "end" : "start"); 40369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 40469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 40569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewAEState) { 40669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (!mAeInPrecapture) { 40769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state 40869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 40969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 41069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture start", __FUNCTION__); 41169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAeInPrecapture = true; 41269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 41369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 41469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } else { 41569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // Waiting to see PRECAPTURE state end 41669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mAETriggerId == mTriggerId && 41769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 41869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGV("%s: Got precapture end", __FUNCTION__); 41969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE; 42069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 42169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 42269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewAEState = false; 42369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 42469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_PRECAPTURE_WAIT; 42569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 42669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 42769230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 42869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 42969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 43069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 43169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 43269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Vector<uint8_t> outputStreams; 43369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 4344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 4354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Set up output streams in the request 4364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - preview 4374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - capture/jpeg 4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - callback (if preview callbacks enabled) 4394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * - recording (if recording enabled) 4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 44169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getPreviewStreamId()); 44269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCaptureStreamId()); 44369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 44469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.previewCallbackFlags & 44569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 44669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getCallbackStreamId()); 44769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 44869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 44969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 45069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams.push(client->getRecordingStreamId()); 45169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 45269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 45369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 45469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala outputStreams); 45569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 45669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.update(ANDROID_REQUEST_ID, 45769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureId, 1); 45869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 45969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == OK) { 46069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mCaptureRequest.sort(); 46169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 46369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 46469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 46569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 46669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 46769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 46869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 4694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Create a capture copy since CameraDeviceBase#capture takes ownership 47069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CameraMetadata captureCopy = mCaptureRequest; 47169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (captureCopy.entryCount() == 0) { 47269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 47369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId()); 47469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 47569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 47669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 4774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin /** 4784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * Clear the streaming request for still-capture pictures 4794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin * (as opposed to i.e. video snapshots) 4804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin */ 48169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (l.mParameters.state == Parameters::STILL_CAPTURE) { 4824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // API definition of takePicture() - stop preview before taking pic 4834c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala res = client->stopStream(); 48469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 48569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 48669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 48769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 48869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 48969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 49069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 49169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala // TODO: Capture should be atomic with setStreamingRequest here 49269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->capture(captureCopy); 49369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 49469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to submit still image capture request: " 49569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "%s (%d)", 49669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala __FUNCTION__, client->getCameraId(), strerror(-res), res); 49769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 49869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 49969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 50069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount = kMaxTimeoutsForCaptureEnd; 50169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 50269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 50369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 50469230df9905534cda15becd44c0109874c4be5f0Eino-Ville TalvalaCaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 50569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 50669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 50769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 50869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala Mutex::Autolock l(mInputMutex); 5094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Wait for new metadata result (mNewFrame) 51169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala while (!mNewFrameReceived) { 51269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 51369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 51469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 51569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 51669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 51769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 5184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Approximation of the shutter being closed 5204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // - TODO: use the hal3 exposure callback in Camera3Device instead 521ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala if (mNewFrameReceived && !mShutterNotified) { 522ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala SharedParameters::Lock l(client->getParameters()); 523a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin /* warning: this also locks a SharedCameraCallbacks */ 524786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin shutterNotifyLocked(l.mParameters, client, mMsgType); 525ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala mShutterNotified = true; 526ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala } 5274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin 5284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin // Wait until jpeg was captured by JpegProcessor 529ad21da9c2b575eddc0d11b789bb577985a0bf50bEino-Ville Talvala while (mNewFrameReceived && !mNewCaptureReceived) { 53069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 53169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res == TIMED_OUT) { 53269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mTimeoutCount--; 53369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala break; 53469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 53569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 53669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mTimeoutCount <= 0) { 53769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Timed out waiting for capture to complete"); 53869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 53969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 54069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameReceived && mNewCaptureReceived) { 54169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mNewFrameId != mCaptureId) { 54269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 54369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mCaptureId, mNewFrameId); 54469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 54569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala camera_metadata_entry_t entry; 54669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 54769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.count == 0) { 54869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("No timestamp field in capture frame!"); 54969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 55069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (entry.data.i64[0] != mCaptureTimestamp) { 55169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGW("Mismatched capture timestamps: Metadata frame %lld," 5524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin " captured buffer %lld", 5534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin entry.data.i64[0], 5544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin mCaptureTimestamp); 55569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 5564c9eb718352697cd75269752344c0bcc6b05e708Eino-Ville Talvala client->removeFrameListener(mCaptureId, mCaptureId + 1, this); 55769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 55869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewFrameReceived = false; 55969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala mNewCaptureReceived = false; 56069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return DONE; 56169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 56269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return STANDARD_CAPTURE_WAIT; 56369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 56469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 565c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart( 566c3dbf1a40df85b75e5805382838a90416f69730fJames Painter sp<Camera2Client> &client) { 567c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGV("%s", __FUNCTION__); 568c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 569c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 570c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 571c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check which burst mode is set, create respective burst object 572c3dbf1a40df85b75e5805382838a90416f69730fJames Painter { 573c3dbf1a40df85b75e5805382838a90416f69730fJames Painter SharedParameters::Lock l(client->getParameters()); 574c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 575c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = updateCaptureRequest(l.mParameters, client); 576c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if(res != OK) { 577c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 578c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 579c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 580c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 581c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // check for burst mode type in mParameters here 582c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // 583c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mBurstCapture = new BurstCapture(client, this); 584c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 585c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 586c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1); 587c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == OK) { 588c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mCaptureRequest.sort(); 589c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 590c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res != OK) { 591c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 592c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId(), strerror(-res), res); 593c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 594c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 595c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 596c3dbf1a40df85b75e5805382838a90416f69730fJames Painter CameraMetadata captureCopy = mCaptureRequest; 597c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (captureCopy.entryCount() == 0) { 598c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 599c3dbf1a40df85b75e5805382838a90416f69730fJames Painter __FUNCTION__, client->getCameraId()); 600c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 601c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 602c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 603c3dbf1a40df85b75e5805382838a90416f69730fJames Painter Vector<CameraMetadata> requests; 604c3dbf1a40df85b75e5805382838a90416f69730fJames Painter requests.push(mCaptureRequest); 605c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mBurstCapture->start(requests, mCaptureId); 606c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10; 607c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 608c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 609c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 610c3dbf1a40df85b75e5805382838a90416f69730fJames PainterCaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait( 611ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkin sp<Camera2Client> &/*client*/) { 612c3dbf1a40df85b75e5805382838a90416f69730fJames Painter status_t res; 613c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ATRACE_CALL(); 614c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 615c3dbf1a40df85b75e5805382838a90416f69730fJames Painter while (!mNewCaptureReceived) { 616c3dbf1a40df85b75e5805382838a90416f69730fJames Painter res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 617c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (res == TIMED_OUT) { 618c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mTimeoutCount--; 619c3dbf1a40df85b75e5805382838a90416f69730fJames Painter break; 620c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 621c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 622c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 623c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mTimeoutCount <= 0) { 624c3dbf1a40df85b75e5805382838a90416f69730fJames Painter ALOGW("Timed out waiting for burst capture to complete"); 625c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 626c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 627c3dbf1a40df85b75e5805382838a90416f69730fJames Painter if (mNewCaptureReceived) { 628c3dbf1a40df85b75e5805382838a90416f69730fJames Painter mNewCaptureReceived = false; 629c3dbf1a40df85b75e5805382838a90416f69730fJames Painter // TODO: update mCaptureId to last burst's capture ID + 1? 630c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return DONE; 631c3dbf1a40df85b75e5805382838a90416f69730fJames Painter } 632c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 633c3dbf1a40df85b75e5805382838a90416f69730fJames Painter return BURST_CAPTURE_WAIT; 634c3dbf1a40df85b75e5805382838a90416f69730fJames Painter} 635c3dbf1a40df85b75e5805382838a90416f69730fJames Painter 63669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 63769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala sp<Camera2Client> &client) { 63869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ATRACE_CALL(); 63969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala status_t res; 64069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (mCaptureRequest.entryCount() == 0) { 64169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = client->getCameraDevice()->createDefaultRequest( 64269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala CAMERA2_TEMPLATE_STILL_CAPTURE, 64369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala &mCaptureRequest); 64469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 64569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to create default still image request:" 64669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala " %s (%d)", __FUNCTION__, client->getCameraId(), 64769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 64869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 64969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 65069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 65169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 65269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala res = params.updateRequest(&mCaptureRequest); 65369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala if (res != OK) { 65469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update common entries of capture " 65569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 65669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala strerror(-res), res); 65769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return res; 65869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 65969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 660db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala res = params.updateRequestJpeg(&mCaptureRequest); 661db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala if (res != OK) { 662db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala ALOGE("%s: Camera %d: Unable to update JPEG entries of capture " 663db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala "request: %s (%d)", __FUNCTION__, client->getCameraId(), 664db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala strerror(-res), res); 665db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala return res; 66669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala } 66769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 66869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala return OK; 66969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala} 67069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 671707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters ¶ms, 672786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin sp<Camera2Client> client, int msgType) { 673707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ATRACE_CALL(); 674707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 675786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin if (params.state == Parameters::STILL_CAPTURE 676786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin && params.playShutterSound 677786a8daf400df7b49f6a7c19a5cea9b504d6aa9eIgor Murashkin && (msgType & CAMERA_MSG_SHUTTER)) { 678707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 679707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 680707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 681707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin { 682a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin Camera2Client::SharedCameraCallbacks::Lock 683a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l(client->mSharedCameraCallbacks); 684707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 685707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ALOGV("%s: Notifying of shutter close to client", __FUNCTION__); 686a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin if (l.mRemoteCallback != 0) { 687707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin // ShutterCallback 688a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_SHUTTER, 689707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin /*ext1*/0, /*ext2*/0); 690707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 691707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin // RawCallback with null buffer 692a2e203bdb911bd5595723651d06ad91c330a7873Igor Murashkin l.mRemoteCallback->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY, 693707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin /*ext1*/0, /*ext2*/0); 694707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } else { 695707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin ALOGV("%s: No client!", __FUNCTION__); 696707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 697707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin } 698707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin} 699707c3e34b067064f45c1b50919e88080fcdb5e77Igor Murashkin 70069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala 70169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace camera2 70269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}; // namespace android 703