Camera: API1: Improve ZSL mode activation heuristics
- Don't engage ZSL if picture size is too small
- Don't engage ZSL if picture size matches preview size
- Include ZSL choice in dumpsys
Bug: 29620318
Change-Id: Ie8e0c5a9e1ed9f177d701f22996c4c1f4b81a71e
diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp
index c8e64fe..005dd69 100644
--- a/services/camera/libcameraservice/api1/Camera2Client.cpp
+++ b/services/camera/libcameraservice/api1/Camera2Client.cpp
@@ -322,6 +322,9 @@
p.fastInfo.bestStillCaptureFpsRange[0],
p.fastInfo.bestStillCaptureFpsRange[1]);
+ result.appendFormat(" Use zero shutter lag: %s\n",
+ p.useZeroShutterLag() ? "yes" : "no");
+
result.append(" Current streams:\n");
result.appendFormat(" Preview stream ID: %d\n",
getPreviewStreamId());
@@ -813,7 +816,7 @@
}
}
- if (params.zslMode && !params.recordingHint &&
+ if (params.useZeroShutterLag() &&
getRecordingStreamId() == NO_STREAM) {
res = updateProcessorStream(mZslProcessor, params);
if (res != OK) {
@@ -1362,7 +1365,7 @@
return OK;
}
- if (l.mParameters.zslMode) {
+ if (l.mParameters.allowZslMode) {
mZslProcessor->clearZslQueue();
}
}
@@ -1460,7 +1463,7 @@
// Clear ZSL buffer queue when Jpeg size is changed.
bool jpegStreamChanged = mJpegProcessor->getStreamId() != lastJpegStreamId;
- if (l.mParameters.zslMode && jpegStreamChanged) {
+ if (l.mParameters.allowZslMode && jpegStreamChanged) {
ALOGV("%s: Camera %d: Clear ZSL buffer queue when Jpeg size is changed",
__FUNCTION__, mCameraId);
mZslProcessor->clearZslQueue();
@@ -1495,7 +1498,7 @@
if (res != OK) return res;
Parameters::focusMode_t focusModeAfter = l.mParameters.focusMode;
- if (l.mParameters.zslMode && focusModeAfter != focusModeBefore) {
+ if (l.mParameters.allowZslMode && focusModeAfter != focusModeBefore) {
mZslProcessor->clearZslQueue();
}
diff --git a/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp b/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp
index e3d6906..05adb29 100644
--- a/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp
+++ b/services/camera/libcameraservice/api1/client2/CaptureSequencer.cpp
@@ -338,7 +338,7 @@
return DONE;
}
- else if (l.mParameters.zslMode &&
+ else if (l.mParameters.useZeroShutterLag() &&
l.mParameters.state == Parameters::STILL_CAPTURE &&
l.mParameters.flashMode != Parameters::FLASH_MODE_ON) {
nextState = ZSL_START;
diff --git a/services/camera/libcameraservice/api1/client2/Parameters.cpp b/services/camera/libcameraservice/api1/client2/Parameters.cpp
index 5779176..9d5f33c 100644
--- a/services/camera/libcameraservice/api1/client2/Parameters.cpp
+++ b/services/camera/libcameraservice/api1/client2/Parameters.cpp
@@ -908,12 +908,12 @@
property_get("camera.disable_zsl_mode", value, "0");
if (!strcmp(value,"1") || slowJpegMode) {
ALOGI("Camera %d: Disabling ZSL mode", cameraId);
- zslMode = false;
+ allowZslMode = false;
} else {
- zslMode = true;
+ allowZslMode = true;
}
- ALOGI("%s: zslMode: %d slowJpegMode %d", __FUNCTION__, zslMode, slowJpegMode);
+ ALOGI("%s: allowZslMode: %d slowJpegMode %d", __FUNCTION__, allowZslMode, slowJpegMode);
state = STOPPED;
@@ -1127,6 +1127,8 @@
ALOGV("Camera %d: Flexible YUV %s supported",
cameraId, fastInfo.useFlexibleYuv ? "is" : "is not");
+ fastInfo.maxJpegSize = getMaxSize(getAvailableJpegSizes());
+
return OK;
}
@@ -2231,6 +2233,25 @@
return pictureSizeOverriden;
}
+bool Parameters::useZeroShutterLag() const {
+ // If ZSL mode is disabled, don't use it
+ if (!allowZslMode) return false;
+ // If recording hint is enabled, don't do ZSL
+ if (recordingHint) return false;
+ // If still capture size is no bigger than preview or video size,
+ // don't do ZSL
+ if (pictureWidth <= previewWidth || pictureHeight <= previewHeight ||
+ pictureWidth <= videoWidth || pictureHeight <= videoHeight) {
+ return false;
+ }
+ // If still capture size is less than quarter of max, don't do ZSL
+ if ((pictureWidth * pictureHeight) <
+ (fastInfo.maxJpegSize.width * fastInfo.maxJpegSize.height / 4) ) {
+ return false;
+ }
+ return true;
+}
+
const char* Parameters::getStateName(State state) {
#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
switch(state) {
diff --git a/services/camera/libcameraservice/api1/client2/Parameters.h b/services/camera/libcameraservice/api1/client2/Parameters.h
index c437722..f4bb34c 100644
--- a/services/camera/libcameraservice/api1/client2/Parameters.h
+++ b/services/camera/libcameraservice/api1/client2/Parameters.h
@@ -161,9 +161,9 @@
bool previewCallbackOneShot;
bool previewCallbackSurface;
- bool zslMode;
+ bool allowZslMode;
// Whether the jpeg stream is slower than 30FPS and can slow down preview.
- // When slowJpegMode is true, zslMode must be false to avoid slowing down preview.
+ // When slowJpegMode is true, allowZslMode must be false to avoid slowing down preview.
bool slowJpegMode;
// Overall camera state
@@ -219,6 +219,7 @@
DefaultKeyedVector<uint8_t, OverrideModes> sceneModeOverrides;
float minFocalLength;
bool useFlexibleYuv;
+ Size maxJpegSize;
} fastInfo;
// Quirks information; these are short-lived flags to enable workarounds for
@@ -271,6 +272,8 @@
status_t recoverOverriddenJpegSize();
// if video snapshot size is currently overridden
bool isJpegSizeOverridden();
+ // whether zero shutter lag should be used for non-recording operation
+ bool useZeroShutterLag() const;
// Calculate the crop region rectangle, either tightly about the preview
// resolution, or a region just based on the active array; both take
diff --git a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp
index a2c9712..de42fb2 100644
--- a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp
+++ b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp
@@ -115,7 +115,7 @@
// Use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG for ZSL streaming case.
if (client->getCameraDeviceVersion() >= CAMERA_DEVICE_API_VERSION_3_0) {
- if (params.zslMode && !params.recordingHint) {
+ if (params.useZeroShutterLag() && !params.recordingHint) {
res = device->createDefaultRequest(CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG,
&mPreviewRequest);
} else {