Merge "QCamera3: Add a vendor key for request ready" into oc-mr1-dev
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index cf8a9d5..c3672b1 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -8124,6 +8124,10 @@
frame_ois_data->ois_sample_shift_x, frame_ois_data->num_ois_sample);
camMetadata.update(NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
frame_ois_data->ois_sample_shift_y, frame_ois_data->num_ois_sample);
+ camMetadata.update(NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_X,
+ frame_ois_data->ois_sample_shift_pixel_x, frame_ois_data->num_ois_sample);
+ camMetadata.update(NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_Y,
+ frame_ois_data->ois_sample_shift_pixel_y, frame_ois_data->num_ois_sample);
}
resultMetadata = camMetadata.release();
@@ -14679,33 +14683,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);
@@ -14713,6 +14781,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 b7be197..0746c11 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();
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
index 8fd0c4e..c5a0675 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.cpp
@@ -357,6 +357,8 @@
{ "stats.ois_timestamps_boottime", TYPE_INT64 },
{ "stats.ois_shift_x", TYPE_INT32 },
{ "stats.ois_shift_y", TYPE_INT32 },
+ { "stats.ois_shift_pixel_x", TYPE_FLOAT },
+ { "stats.ois_shift_pixel_y", TYPE_FLOAT },
{ "sensor.pd_data_dimensions", TYPE_INT32},
{ "sensor.pd_data_enable", TYPE_BYTE},
{ "control.exposure_time_boost", TYPE_FLOAT},
@@ -595,6 +597,8 @@
(uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_TIMESTAMPS_BOOTTIME,
(uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_X,
(uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
+ (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_X,
+ (uint32_t)NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_Y,
(uint32_t)NEXUS_EXPERIMENTAL_2017_PD_DATA_DIMENSIONS,
(uint32_t)NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
(uint32_t)NEXUS_EXPERIMENTAL_2017_EXP_TIME_BOOST,
diff --git a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
index 082faa1..bf0167e 100644
--- a/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
+++ b/msm8998/QCamera2/HAL3/QCamera3VendorTags.h
@@ -437,6 +437,8 @@
NEXUS_EXPERIMENTAL_2017_OIS_TIMESTAMPS_BOOTTIME,
NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_X,
NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_Y,
+ NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_X,
+ NEXUS_EXPERIMENTAL_2017_OIS_SHIFT_PIXEL_Y,
/* PD plumbing */
NEXUS_EXPERIMENTAL_2017_PD_DATA_DIMENSIONS,
NEXUS_EXPERIMENTAL_2017_PD_DATA_ENABLE,
diff --git a/msm8998/QCamera2/stack/common/cam_types.h b/msm8998/QCamera2/stack/common/cam_types.h
index fc7a134..fd75193 100644
--- a/msm8998/QCamera2/stack/common/cam_types.h
+++ b/msm8998/QCamera2/stack/common/cam_types.h
@@ -995,6 +995,8 @@
int64_t ois_sample_timestamp_boottime[MAX_OIS_SAMPLE_NUM_PER_FRAME];
int32_t ois_sample_shift_x[MAX_OIS_SAMPLE_NUM_PER_FRAME];
int32_t ois_sample_shift_y[MAX_OIS_SAMPLE_NUM_PER_FRAME];
+ float ois_sample_shift_pixel_x[MAX_OIS_SAMPLE_NUM_PER_FRAME];
+ float ois_sample_shift_pixel_y[MAX_OIS_SAMPLE_NUM_PER_FRAME];
} cam_frame_ois_info_t;
typedef struct {