|
|
|
@ -885,14 +885,14 @@ status_t Camera3Device::convertMetadataListToRequestListLocked(
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t Camera3Device::capture(CameraMetadata &request, int64_t* /*lastFrameNumber*/) {
|
|
|
|
|
status_t Camera3Device::capture(CameraMetadata &request, int64_t* lastFrameNumber) {
|
|
|
|
|
ATRACE_CALL();
|
|
|
|
|
|
|
|
|
|
List<const PhysicalCameraSettingsList> requestsList;
|
|
|
|
|
std::list<const SurfaceMap> surfaceMaps;
|
|
|
|
|
convertToRequestList(requestsList, surfaceMaps, request);
|
|
|
|
|
|
|
|
|
|
return captureList(requestsList, surfaceMaps, /*lastFrameNumber*/NULL);
|
|
|
|
|
return captureList(requestsList, surfaceMaps, lastFrameNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Camera3Device::convertToRequestList(List<const PhysicalCameraSettingsList>& requestsList,
|
|
|
|
@ -1027,11 +1027,22 @@ hardware::Return<void> Camera3Device::requestStreamBuffers(
|
|
|
|
|
return hardware::Void();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (outputStream->isAbandoned()) {
|
|
|
|
|
bufRet.val.error(StreamBufferRequestError::STREAM_DISCONNECTED);
|
|
|
|
|
allReqsSucceeds = false;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bufRet.streamId = streamId;
|
|
|
|
|
size_t handOutBufferCount = outputStream->getOutstandingBuffersCount();
|
|
|
|
|
uint32_t numBuffersRequested = bufReq.numBuffersRequested;
|
|
|
|
|
size_t totalHandout = outputStream->getOutstandingBuffersCount() + numBuffersRequested;
|
|
|
|
|
if (totalHandout > outputStream->asHalStream()->max_buffers) {
|
|
|
|
|
size_t totalHandout = handOutBufferCount + numBuffersRequested;
|
|
|
|
|
uint32_t maxBuffers = outputStream->asHalStream()->max_buffers;
|
|
|
|
|
if (totalHandout > maxBuffers) {
|
|
|
|
|
// Not able to allocate enough buffer. Exit early for this stream
|
|
|
|
|
ALOGE("%s: request too much buffers for stream %d: at HAL: %zu + requesting: %d"
|
|
|
|
|
" > max: %d", __FUNCTION__, streamId, handOutBufferCount,
|
|
|
|
|
numBuffersRequested, maxBuffers);
|
|
|
|
|
bufRet.val.error(StreamBufferRequestError::MAX_BUFFER_EXCEEDED);
|
|
|
|
|
allReqsSucceeds = false;
|
|
|
|
|
continue;
|
|
|
|
@ -2186,12 +2197,11 @@ status_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout) {
|
|
|
|
|
|
|
|
|
|
mStatusWaiters++;
|
|
|
|
|
|
|
|
|
|
// Notify HAL to start draining. We need to notify the HalInterface layer
|
|
|
|
|
// even when the device is already IDLE, so HalInterface can reject incoming
|
|
|
|
|
// requestStreamBuffers call.
|
|
|
|
|
if (!active && mUseHalBufManager) {
|
|
|
|
|
auto streamIds = mOutputStreams.getStreamIds();
|
|
|
|
|
mRequestThread->signalPipelineDrain(streamIds);
|
|
|
|
|
if (mStatus == STATUS_ACTIVE) {
|
|
|
|
|
mRequestThread->signalPipelineDrain(streamIds);
|
|
|
|
|
}
|
|
|
|
|
mRequestBufferSM.onWaitUntilIdle();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -5308,6 +5318,11 @@ bool Camera3Device::RequestThread::threadLoop() {
|
|
|
|
|
ALOGVV("%s: %d: submitting %zu requests in a batch.", __FUNCTION__, __LINE__,
|
|
|
|
|
mNextRequests.size());
|
|
|
|
|
|
|
|
|
|
sp<Camera3Device> parent = mParent.promote();
|
|
|
|
|
if (parent != nullptr) {
|
|
|
|
|
parent->mRequestBufferSM.onSubmittingRequest();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool submitRequestSuccess = false;
|
|
|
|
|
nsecs_t tRequestStart = systemTime(SYSTEM_TIME_MONOTONIC);
|
|
|
|
|
if (mInterface->supportBatchRequest()) {
|
|
|
|
@ -5318,13 +5333,6 @@ bool Camera3Device::RequestThread::threadLoop() {
|
|
|
|
|
nsecs_t tRequestEnd = systemTime(SYSTEM_TIME_MONOTONIC);
|
|
|
|
|
mRequestLatency.add(tRequestStart, tRequestEnd);
|
|
|
|
|
|
|
|
|
|
if (submitRequestSuccess) {
|
|
|
|
|
sp<Camera3Device> parent = mParent.promote();
|
|
|
|
|
if (parent != nullptr) {
|
|
|
|
|
parent->mRequestBufferSM.onRequestSubmitted();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (useFlushLock) {
|
|
|
|
|
mFlushLock.unlock();
|
|
|
|
|
}
|
|
|
|
@ -6486,9 +6494,11 @@ void Camera3Device::RequestBufferStateMachine::onStreamsConfigured() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Camera3Device::RequestBufferStateMachine::onRequestSubmitted() {
|
|
|
|
|
void Camera3Device::RequestBufferStateMachine::onSubmittingRequest() {
|
|
|
|
|
std::lock_guard<std::mutex> lock(mLock);
|
|
|
|
|
mRequestThreadPaused = false;
|
|
|
|
|
// inflight map register actually happens in prepareHalRequest now, but it is close enough
|
|
|
|
|
// approximation.
|
|
|
|
|
mInflightMapEmpty = false;
|
|
|
|
|
if (mStatus == RB_STATUS_STOPPED) {
|
|
|
|
|
mStatus = RB_STATUS_READY;
|
|
|
|
|