1*ec779b8eSAndroid Build Coastguard Worker/* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker#include <vector> 18*ec779b8eSAndroid Build Coastguard Worker#include <inttypes.h> 19*ec779b8eSAndroid Build Coastguard Worker#include "ACameraDevice.h" 20*ec779b8eSAndroid Build Coastguard Worker#include "ACameraMetadata.h" 21*ec779b8eSAndroid Build Coastguard Worker#include "ACaptureRequest.h" 22*ec779b8eSAndroid Build Coastguard Worker#include "ACameraCaptureSession.h" 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Workernamespace android { 25*ec779b8eSAndroid Build Coastguard Workernamespace acam { 26*ec779b8eSAndroid Build Coastguard Worker 27*ec779b8eSAndroid Build Coastguard Workertemplate<class T> 28*ec779b8eSAndroid Build Coastguard Workercamera_status_t 29*ec779b8eSAndroid Build Coastguard WorkerCameraDevice::captureLocked( 30*ec779b8eSAndroid Build Coastguard Worker sp<ACameraCaptureSession> session, 31*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 32*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 33*ec779b8eSAndroid Build Coastguard Worker /*optional*/int* captureSequenceId) { 34*ec779b8eSAndroid Build Coastguard Worker return submitRequestsLocked( 35*ec779b8eSAndroid Build Coastguard Worker session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/false); 36*ec779b8eSAndroid Build Coastguard Worker} 37*ec779b8eSAndroid Build Coastguard Worker 38*ec779b8eSAndroid Build Coastguard Workertemplate<class T> 39*ec779b8eSAndroid Build Coastguard Workercamera_status_t 40*ec779b8eSAndroid Build Coastguard WorkerCameraDevice::setRepeatingRequestsLocked( 41*ec779b8eSAndroid Build Coastguard Worker sp<ACameraCaptureSession> session, 42*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 43*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 44*ec779b8eSAndroid Build Coastguard Worker /*optional*/int* captureSequenceId) { 45*ec779b8eSAndroid Build Coastguard Worker return submitRequestsLocked( 46*ec779b8eSAndroid Build Coastguard Worker session, cbs, numRequests, requests, captureSequenceId, /*isRepeating*/true); 47*ec779b8eSAndroid Build Coastguard Worker} 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Workertemplate<class T> 50*ec779b8eSAndroid Build Coastguard Workercamera_status_t CameraDevice::submitRequestsLocked( 51*ec779b8eSAndroid Build Coastguard Worker sp<ACameraCaptureSession> session, 52*ec779b8eSAndroid Build Coastguard Worker /*optional*/T* cbs, 53*ec779b8eSAndroid Build Coastguard Worker int numRequests, ACaptureRequest** requests, 54*ec779b8eSAndroid Build Coastguard Worker /*optional*/int* captureSequenceId, 55*ec779b8eSAndroid Build Coastguard Worker bool isRepeating) { 56*ec779b8eSAndroid Build Coastguard Worker camera_status_t ret = checkCameraClosedOrErrorLocked(); 57*ec779b8eSAndroid Build Coastguard Worker if (ret != ACAMERA_OK) { 58*ec779b8eSAndroid Build Coastguard Worker ALOGE("Camera %s submit capture request failed! ret %d", getId(), ret); 59*ec779b8eSAndroid Build Coastguard Worker return ret; 60*ec779b8eSAndroid Build Coastguard Worker } 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker // Form two vectors of capture request, one for internal tracking 63*ec779b8eSAndroid Build Coastguard Worker std::vector<hardware::camera2::CaptureRequest> requestList; 64*ec779b8eSAndroid Build Coastguard Worker Vector<sp<CaptureRequest> > requestsV; 65*ec779b8eSAndroid Build Coastguard Worker requestsV.setCapacity(numRequests); 66*ec779b8eSAndroid Build Coastguard Worker for (int i = 0; i < numRequests; i++) { 67*ec779b8eSAndroid Build Coastguard Worker sp<CaptureRequest> req; 68*ec779b8eSAndroid Build Coastguard Worker ret = allocateCaptureRequest(requests[i], req); 69*ec779b8eSAndroid Build Coastguard Worker if (ret != ACAMERA_OK) { 70*ec779b8eSAndroid Build Coastguard Worker ALOGE("Convert capture request to internal format failure! ret %d", ret); 71*ec779b8eSAndroid Build Coastguard Worker return ret; 72*ec779b8eSAndroid Build Coastguard Worker } 73*ec779b8eSAndroid Build Coastguard Worker if (req->mSurfaceList.empty()) { 74*ec779b8eSAndroid Build Coastguard Worker ALOGE("Capture request without output target cannot be submitted!"); 75*ec779b8eSAndroid Build Coastguard Worker return ACAMERA_ERROR_INVALID_PARAMETER; 76*ec779b8eSAndroid Build Coastguard Worker } 77*ec779b8eSAndroid Build Coastguard Worker requestList.push_back(*(req.get())); 78*ec779b8eSAndroid Build Coastguard Worker requestsV.push_back(req); 79*ec779b8eSAndroid Build Coastguard Worker } 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker if (isRepeating) { 82*ec779b8eSAndroid Build Coastguard Worker ret = stopRepeatingLocked(); 83*ec779b8eSAndroid Build Coastguard Worker if (ret != ACAMERA_OK) { 84*ec779b8eSAndroid Build Coastguard Worker ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret); 85*ec779b8eSAndroid Build Coastguard Worker return ret; 86*ec779b8eSAndroid Build Coastguard Worker } 87*ec779b8eSAndroid Build Coastguard Worker } 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker binder::Status remoteRet; 90*ec779b8eSAndroid Build Coastguard Worker hardware::camera2::utils::SubmitInfo info; 91*ec779b8eSAndroid Build Coastguard Worker remoteRet = mRemote->submitRequestList(requestList, isRepeating, &info); 92*ec779b8eSAndroid Build Coastguard Worker int sequenceId = info.mRequestId; 93*ec779b8eSAndroid Build Coastguard Worker int64_t lastFrameNumber = info.mLastFrameNumber; 94*ec779b8eSAndroid Build Coastguard Worker if (sequenceId < 0) { 95*ec779b8eSAndroid Build Coastguard Worker ALOGE("Camera %s submit request remote failure: ret %d", getId(), sequenceId); 96*ec779b8eSAndroid Build Coastguard Worker return ACAMERA_ERROR_UNKNOWN; 97*ec779b8eSAndroid Build Coastguard Worker } 98*ec779b8eSAndroid Build Coastguard Worker 99*ec779b8eSAndroid Build Coastguard Worker CallbackHolder cbHolder(session, requestsV, isRepeating, cbs); 100*ec779b8eSAndroid Build Coastguard Worker mSequenceCallbackMap.insert(std::make_pair(sequenceId, cbHolder)); 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker if (isRepeating) { 103*ec779b8eSAndroid Build Coastguard Worker // stopRepeating above should have cleanup repeating sequence id 104*ec779b8eSAndroid Build Coastguard Worker if (mRepeatingSequenceId != REQUEST_ID_NONE) { 105*ec779b8eSAndroid Build Coastguard Worker setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE); 106*ec779b8eSAndroid Build Coastguard Worker return ACAMERA_ERROR_CAMERA_DEVICE; 107*ec779b8eSAndroid Build Coastguard Worker } 108*ec779b8eSAndroid Build Coastguard Worker mRepeatingSequenceId = sequenceId; 109*ec779b8eSAndroid Build Coastguard Worker } else { 110*ec779b8eSAndroid Build Coastguard Worker mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber)); 111*ec779b8eSAndroid Build Coastguard Worker } 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker if (mIdle) { 114*ec779b8eSAndroid Build Coastguard Worker sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler); 115*ec779b8eSAndroid Build Coastguard Worker msg->setPointer(kContextKey, session->mUserSessionCallback.context); 116*ec779b8eSAndroid Build Coastguard Worker msg->setObject(kSessionSpKey, session); 117*ec779b8eSAndroid Build Coastguard Worker msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive); 118*ec779b8eSAndroid Build Coastguard Worker postSessionMsgAndCleanup(msg); 119*ec779b8eSAndroid Build Coastguard Worker } 120*ec779b8eSAndroid Build Coastguard Worker mIdle = false; 121*ec779b8eSAndroid Build Coastguard Worker mBusySession = session; 122*ec779b8eSAndroid Build Coastguard Worker 123*ec779b8eSAndroid Build Coastguard Worker if (captureSequenceId) { 124*ec779b8eSAndroid Build Coastguard Worker *captureSequenceId = sequenceId; 125*ec779b8eSAndroid Build Coastguard Worker } 126*ec779b8eSAndroid Build Coastguard Worker return ACAMERA_OK; 127*ec779b8eSAndroid Build Coastguard Worker} 128*ec779b8eSAndroid Build Coastguard Worker 129*ec779b8eSAndroid Build Coastguard Worker} // namespace acam 130*ec779b8eSAndroid Build Coastguard Worker} // namespace android 131