summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChien-Yu Chen <cychen@google.com>2017-09-25 14:34:26 -0700
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-09-29 00:57:39 +0000
commit940e99538583ce0bee8cdf77f9c48a02c1caccec (patch)
tree216b007d2c09d125aebac22064d5b59f00e8548f
parent6d2846591343df7604f39442c1270c3c6a7b5915 (diff)
downloadcamera-940e99538583ce0bee8cdf77f9c48a02c1caccec.tar.gz
QCamera3: Enable face detection in HDR+ mode
Enable face detection in HDR+ mode and remove face information if the app doesn't request it. Test: CTS Bug: 66163000 Change-Id: Ib33de07e73a3c8917dd0d051b091e6b858df3de1 (cherry picked from commit 21b9e9a40e2a4003a1d19c3f5bc65f17fcdbe2ba)
-rw-r--r--msm8998/QCamera2/HAL3/QCamera3HWI.cpp52
-rw-r--r--msm8998/QCamera2/HAL3/QCamera3HWI.h8
2 files changed, 49 insertions, 11 deletions
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
index 604ff89..54b427d 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.cpp
@@ -511,6 +511,7 @@ QCamera3HardwareInterface::QCamera3HardwareInterface(uint32_t cameraId,
mAecSkipDisplayFrameBound(0),
mInstantAecFrameIdxCount(0),
mLastRequestedLensShadingMapMode(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF),
+ mLastRequestedFaceDetectMode(ANDROID_STATISTICS_FACE_DETECT_MODE_OFF),
mCurrFeatureState(0),
mLdafCalibExist(false),
mLastCustIntentFrmNum(-1),
@@ -4233,6 +4234,34 @@ void QCamera3HardwareInterface::handleBufferWithLock(
}
}
+void QCamera3HardwareInterface::removeUnrequestedMetadata(pendingRequestIterator requestIter,
+ camera_metadata_t *resultMetadata) {
+ CameraMetadata metadata;
+ metadata.acquire(resultMetadata);
+
+ // Remove len shading map if it's not requested.
+ if (requestIter->requestedLensShadingMapMode == ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF &&
+ metadata.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE) &&
+ metadata.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF).data.u8[0] !=
+ ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
+ metadata.erase(ANDROID_STATISTICS_LENS_SHADING_MAP);
+ metadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,
+ &requestIter->requestedLensShadingMapMode, 1);
+ }
+
+ // Remove face information if it's not requested.
+ if (requestIter->requestedFaceDetectMode == ANDROID_STATISTICS_FACE_DETECT_MODE_OFF &&
+ metadata.exists(ANDROID_STATISTICS_FACE_DETECT_MODE) &&
+ metadata.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0] !=
+ ANDROID_STATISTICS_FACE_DETECT_MODE_OFF) {
+ metadata.erase(ANDROID_STATISTICS_FACE_RECTANGLES);
+ metadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE,
+ &requestIter->requestedFaceDetectMode, 1);
+ }
+
+ requestIter->resultMetadata = metadata.release();
+}
+
void QCamera3HardwareInterface::handlePendingResultMetadataWithLock(uint32_t frameNumber,
camera_metadata_t *resultMetadata)
{
@@ -4275,15 +4304,8 @@ void QCamera3HardwareInterface::handlePendingResultMetadataWithLock(uint32_t fra
}
}
- // Remove len shading map if it's not requested.
- if (requestIter->requestedLensShadingMapMode == ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF) {
- CameraMetadata metadata;
- metadata.acquire(resultMetadata);
- metadata.erase(ANDROID_STATISTICS_LENS_SHADING_MAP);
- metadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,
- &requestIter->requestedLensShadingMapMode, 1);
-
- requestIter->resultMetadata = metadata.release();
+ if (requestIter->input_buffer == nullptr) {
+ removeUnrequestedMetadata(requestIter, resultMetadata);
}
dispatchResultMetadataWithLock(frameNumber, liveRequest);
@@ -5444,6 +5466,11 @@ no_error:
requestedLensShadingMapMode = mLastRequestedLensShadingMapMode;
}
+ if (meta.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
+ mLastRequestedFaceDetectMode =
+ meta.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
+ }
+
bool hdrPlusRequest = false;
HdrPlusPendingRequest pendingHdrPlusRequest = {};
@@ -5483,12 +5510,14 @@ no_error:
}
{
- // If HDR+ mode is enabled, override lens shading mode to ON so lens shading map
- // will be reported in result metadata.
+ // If HDR+ mode is enabled, override the following modes so the necessary metadata
+ // will be included in the result metadata sent to Easel HDR+.
std::unique_lock<std::mutex> l(gHdrPlusClientLock);
if (mHdrPlusModeEnabled) {
ADD_SET_PARAM_ENTRY_TO_BATCH(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_ON);
+ ADD_SET_PARAM_ENTRY_TO_BATCH(mParameters, CAM_INTF_META_STATS_FACEDETECT_MODE,
+ ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE);
}
}
}
@@ -5552,6 +5581,7 @@ no_error:
pendingRequest.blob_request = blob_request;
pendingRequest.timestamp = 0;
pendingRequest.requestedLensShadingMapMode = requestedLensShadingMapMode;
+ pendingRequest.requestedFaceDetectMode = mLastRequestedFaceDetectMode;
if (request->input_buffer) {
pendingRequest.input_buffer =
(camera3_stream_buffer_t*)malloc(sizeof(camera3_stream_buffer_t));
diff --git a/msm8998/QCamera2/HAL3/QCamera3HWI.h b/msm8998/QCamera2/HAL3/QCamera3HWI.h
index c601b93..4eaf8a8 100644
--- a/msm8998/QCamera2/HAL3/QCamera3HWI.h
+++ b/msm8998/QCamera2/HAL3/QCamera3HWI.h
@@ -607,6 +607,7 @@ private:
bool enableZsl; // If ZSL is enabled.
bool hdrplus; // If this is an HDR+ request.
uint8_t requestedLensShadingMapMode; // Lens shading map mode for this request.
+ uint8_t requestedFaceDetectMode; // Face detect mode for this request.
bool partialResultDropped; // Whether partial metadata is dropped.
} PendingRequestInfo;
typedef struct {
@@ -697,6 +698,8 @@ private:
QCamera3CropRegionMapper mCropRegionMapper;
// Last lens shading map mode framework requsted.
uint8_t mLastRequestedLensShadingMapMode;
+ // Last face detect mode framework requsted.
+ uint8_t mLastRequestedFaceDetectMode;
cam_feature_mask_t mCurrFeatureState;
/* Ldaf calibration data */
@@ -749,6 +752,11 @@ private:
static const QCameraPropMap CDS_MAP[];
pendingRequestIterator erasePendingRequest(pendingRequestIterator i);
+
+ // Remove unrequested metadata due to Easel HDR+.
+ void removeUnrequestedMetadata(pendingRequestIterator requestIter,
+ camera_metadata_t *resultMetadata);
+
//GPU library to read buffer padding details.
void *lib_surface_utils;
int (*LINK_get_surface_pixel_alignment)();