diff options
author | Chien-Yu Chen <cychen@google.com> | 2017-09-25 14:34:26 -0700 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-09-29 00:57:39 +0000 |
commit | 940e99538583ce0bee8cdf77f9c48a02c1caccec (patch) | |
tree | 216b007d2c09d125aebac22064d5b59f00e8548f | |
parent | 6d2846591343df7604f39442c1270c3c6a7b5915 (diff) | |
download | camera-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.cpp | 52 | ||||
-rw-r--r-- | msm8998/QCamera2/HAL3/QCamera3HWI.h | 8 |
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)(); |