Merge "QCamera3: Do not cache Jpeg input buffers" into oc-mr1-dev
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index 6f079ce..7861a95 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -14678,33 +14678,97 @@
}
}
-bool QCamera3HardwareInterface::trySubmittingHdrPlusRequestLocked(
- HdrPlusPendingRequest *hdrPlusRequest, const camera3_capture_request_t &request,
- const CameraMetadata &metadata)
-{
- if (hdrPlusRequest == nullptr) return false;
-
- // Check noise reduction mode is high quality.
+bool QCamera3HardwareInterface::isRequestHdrPlusCompatible(
+ const camera3_capture_request_t &request, const CameraMetadata &metadata) {
if (!metadata.exists(ANDROID_NOISE_REDUCTION_MODE) ||
metadata.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0] !=
ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY) {
- ALOGD("%s: Not an HDR+ request: ANDROID_NOISE_REDUCTION_MODE is not HQ: %d", __FUNCTION__,
+ ALOGV("%s: ANDROID_NOISE_REDUCTION_MODE is not HQ: %d", __FUNCTION__,
metadata.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]);
return false;
}
- // Check edge mode is high quality.
if (!metadata.exists(ANDROID_EDGE_MODE) ||
- metadata.find(ANDROID_EDGE_MODE).data.u8[0] != ANDROID_EDGE_MODE_HIGH_QUALITY) {
- ALOGD("%s: Not an HDR+ request: ANDROID_EDGE_MODE is not HQ.", __FUNCTION__);
+ metadata.find(ANDROID_EDGE_MODE).data.u8[0] != ANDROID_EDGE_MODE_HIGH_QUALITY) {
+ ALOGV("%s: ANDROID_EDGE_MODE is not HQ.", __FUNCTION__);
return false;
}
+ if (!metadata.exists(ANDROID_COLOR_CORRECTION_ABERRATION_MODE) ||
+ metadata.find(ANDROID_COLOR_CORRECTION_ABERRATION_MODE).data.u8[0] !=
+ ANDROID_COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY) {
+ ALOGV("%s: ANDROID_COLOR_CORRECTION_ABERRATION_MODE is not HQ.", __FUNCTION__);
+ return false;
+ }
+
+ if (!metadata.exists(ANDROID_CONTROL_AE_MODE) ||
+ (metadata.find(ANDROID_CONTROL_AE_MODE).data.u8[0] != ANDROID_CONTROL_AE_MODE_ON &&
+ metadata.find(ANDROID_CONTROL_AE_MODE).data.u8[0] !=
+ ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH)) {
+ ALOGV("%s: ANDROID_CONTROL_AE_MODE is not ON or ON_AUTO_FLASH.", __FUNCTION__);
+ return false;
+ }
+
+ if (!metadata.exists(ANDROID_CONTROL_AWB_MODE) ||
+ metadata.find(ANDROID_CONTROL_AWB_MODE).data.u8[0] != ANDROID_CONTROL_AWB_MODE_AUTO) {
+ ALOGV("%s: ANDROID_CONTROL_AWB_MODE is not AUTO.", __FUNCTION__);
+ return false;
+ }
+
+ if (!metadata.exists(ANDROID_CONTROL_EFFECT_MODE) ||
+ metadata.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0] !=
+ ANDROID_CONTROL_EFFECT_MODE_OFF) {
+ ALOGV("%s: ANDROID_CONTROL_EFFECT_MODE_OFF is not OFF.", __FUNCTION__);
+ return false;
+ }
+
+ if (!metadata.exists(ANDROID_CONTROL_MODE) ||
+ (metadata.find(ANDROID_CONTROL_MODE).data.u8[0] != ANDROID_CONTROL_MODE_AUTO &&
+ metadata.find(ANDROID_CONTROL_MODE).data.u8[0] !=
+ ANDROID_CONTROL_MODE_USE_SCENE_MODE)) {
+ ALOGV("%s: ANDROID_CONTROL_MODE is not AUTO or USE_SCENE_MODE.", __FUNCTION__);
+ return false;
+ }
+
+ // TODO (b/32585046): support non-ZSL.
+ if (!metadata.exists(ANDROID_CONTROL_ENABLE_ZSL) ||
+ metadata.find(ANDROID_CONTROL_ENABLE_ZSL).data.u8[0] != ANDROID_CONTROL_ENABLE_ZSL_TRUE) {
+ ALOGV("%s: ANDROID_CONTROL_ENABLE_ZSL is not true.", __FUNCTION__);
+ return false;
+ }
+
+ // TODO (b/32586081): support flash.
+ if (!metadata.exists(ANDROID_FLASH_MODE) ||
+ metadata.find(ANDROID_FLASH_MODE).data.u8[0] != ANDROID_FLASH_MODE_OFF) {
+ ALOGV("%s: ANDROID_FLASH_MODE is not OFF.", __FUNCTION__);
+ return false;
+ }
+
+ // TODO (b/36492953): support digital zoom.
+ if (!metadata.exists(ANDROID_SCALER_CROP_REGION) ||
+ metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[0] != 0 ||
+ metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[1] != 0 ||
+ metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[2] !=
+ gCamCapability[mCameraId]->active_array_size.width ||
+ metadata.find(ANDROID_SCALER_CROP_REGION).data.i32[3] !=
+ gCamCapability[mCameraId]->active_array_size.height) {
+ ALOGV("%s: ANDROID_SCALER_CROP_REGION is not the same as active array region.",
+ __FUNCTION__);
+ return false;
+ }
+
+ if (!metadata.exists(ANDROID_TONEMAP_MODE) ||
+ metadata.find(ANDROID_TONEMAP_MODE).data.u8[0] != ANDROID_TONEMAP_MODE_HIGH_QUALITY) {
+ ALOGV("%s: ANDROID_TONEMAP_MODE is not HQ.", __FUNCTION__);
+ return false;
+ }
+
+ // TODO (b/36693254, b/36690506): support other outputs.
if (request.num_output_buffers != 1 ||
request.output_buffers[0].stream->format != HAL_PIXEL_FORMAT_BLOB) {
- ALOGD("%s: Not an HDR+ request: Only Jpeg output is supported.", __FUNCTION__);
+ ALOGV("%s: Not an HDR+ request: Only Jpeg output is supported.", __FUNCTION__);
for (uint32_t i = 0; i < request.num_output_buffers; i++) {
- ALOGD("%s: output_buffers[%u]: %dx%d format %d", __FUNCTION__, i,
+ ALOGV("%s: output_buffers[%u]: %dx%d format %d", __FUNCTION__, i,
request.output_buffers[0].stream->width,
request.output_buffers[0].stream->height,
request.output_buffers[0].stream->format);
@@ -14712,6 +14776,16 @@
return false;
}
+ return true;
+}
+
+bool QCamera3HardwareInterface::trySubmittingHdrPlusRequestLocked(
+ HdrPlusPendingRequest *hdrPlusRequest, const camera3_capture_request_t &request,
+ const CameraMetadata &metadata)
+{
+ if (hdrPlusRequest == nullptr) return false;
+ if (!isRequestHdrPlusCompatible(request, metadata)) return false;
+
// Get a YUV buffer from pic channel.
QCamera3PicChannel *picChannel = (QCamera3PicChannel*)request.output_buffers[0].stream->priv;
auto yuvBuffer = std::make_shared<mm_camera_buf_def_t>();
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h
index 9e59bba..2306b36 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.h
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h
@@ -806,6 +806,10 @@
// Return if current session with configured streams is compatible with HDR+ mode.
bool isSessionHdrPlusModeCompatible();
+ // Return if the request is compatible with HDR+.
+ bool isRequestHdrPlusCompatible(
+ const camera3_capture_request_t &request, const CameraMetadata &metadata);
+
// Configure streams for HDR+.
status_t configureHdrPlusStreamsLocked();