From 6e2ba3f8c454f7fc2c2f8c3619ce818ad715c02e Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Thu, 25 Oct 2018 12:36:52 +0100 Subject: [PATCH] Camera: Avoid device sync during capture if possible Currently we always sync using the latest request id before standard capture. The purpose is to avoid sending triggers and 3A mode settings out of sync to Hal. However during regular capture the precapture trigger is not always used so we should be able to skip the device sync in this case. This can enable capture requests to arrive in Hal with one preview frame earlier. Bug: 79682338 Test: Camera CTS Change-Id: I9ea0b03968266d5c8f1e187358f13a21d394ff90 --- .../libcameraservice/api1/Camera2Client.cpp | 21 +++++++++++++++++-- .../api1/client2/Parameters.cpp | 1 + .../api1/client2/Parameters.h | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp index ab4971d929..c9c216b3ce 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.cpp +++ b/services/camera/libcameraservice/api1/Camera2Client.cpp @@ -1446,6 +1446,7 @@ status_t Camera2Client::takePicture(int /*msgType*/) { if ( (res = checkPid(__FUNCTION__) ) != OK) return res; int takePictureCounter; + bool shouldSyncWithDevice = true; { SharedParameters::Lock l(mParameters); switch (l.mParameters.state) { @@ -1531,12 +1532,23 @@ status_t Camera2Client::takePicture(int /*msgType*/) { __FUNCTION__, mCameraId); mZslProcessor->clearZslQueue(); } + + // We should always sync with the device in case flash is turned on, + // the camera device suggests that flash is needed (AE state FLASH_REQUIRED) + // or we are in some other AE state different from CONVERGED that may need + // precapture trigger. + if (l.mParameters.flashMode != Parameters::FLASH_MODE_ON && + (l.mParameters.aeState == ANDROID_CONTROL_AE_STATE_CONVERGED)) { + shouldSyncWithDevice = false; + } } ATRACE_ASYNC_BEGIN(kTakepictureLabel, takePictureCounter); - // Need HAL to have correct settings before (possibly) triggering precapture - syncWithDevice(); + // Make sure HAL has correct settings in case precapture trigger is needed. + if (shouldSyncWithDevice) { + syncWithDevice(); + } res = mCaptureSequencer->startCapture(); if (res != OK) { @@ -1905,6 +1917,11 @@ void Camera2Client::notifyAutoFocus(uint8_t newState, int triggerId) { void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) { ALOGV("%s: Autoexposure state now %d, last trigger %d", __FUNCTION__, newState, triggerId); + { + SharedParameters::Lock l(mParameters); + // Update state + l.mParameters.aeState = newState; + } mCaptureSequencer->notifyAutoExposure(newState, triggerId); } diff --git a/services/camera/libcameraservice/api1/client2/Parameters.cpp b/services/camera/libcameraservice/api1/client2/Parameters.cpp index 28d186abb4..7b1454d690 100644 --- a/services/camera/libcameraservice/api1/client2/Parameters.cpp +++ b/services/camera/libcameraservice/api1/client2/Parameters.cpp @@ -757,6 +757,7 @@ status_t Parameters::initialize(CameraDeviceBase *device, int deviceVersion) { focusState = ANDROID_CONTROL_AF_STATE_INACTIVE; shadowFocusMode = FOCUS_MODE_INVALID; + aeState = ANDROID_CONTROL_AE_STATE_INACTIVE; camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS, Parameters::NUM_REGION, Parameters::NUM_REGION); if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT; diff --git a/services/camera/libcameraservice/api1/client2/Parameters.h b/services/camera/libcameraservice/api1/client2/Parameters.h index 42e7a47c82..e0086489cb 100644 --- a/services/camera/libcameraservice/api1/client2/Parameters.h +++ b/services/camera/libcameraservice/api1/client2/Parameters.h @@ -122,6 +122,7 @@ struct Parameters { int32_t high; }; + uint8_t aeState; //latest AE state from Hal int32_t exposureCompensation; bool autoExposureLock; bool autoExposureLockAvailable;