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
gugelfrei
Emilian Peev 6 years ago
parent fec151edf5
commit 6e2ba3f8c4

@ -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);
}

@ -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;

@ -122,6 +122,7 @@ struct Parameters {
int32_t high;
};
uint8_t aeState; //latest AE state from Hal
int32_t exposureCompensation;
bool autoExposureLock;
bool autoExposureLockAvailable;

Loading…
Cancel
Save