Camera3: Add support for face detection
1. Expose maximum number of faces via capabilites.
2. Add new parameter/metadata field for face detection mode.
Change-Id: I6505ab7558cc50f815211df71f70ec1989ce6785
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.cpp b/camera/QCamera2/HAL3/QCamera3HWI.cpp
index 2dd682e..1158b3b 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.cpp
+++ b/camera/QCamera2/HAL3/QCamera3HWI.cpp
@@ -126,6 +126,11 @@
{ ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH }
};
+const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = {
+ { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, CAM_FACE_DETECT_MODE_OFF },
+ { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL, CAM_FACE_DETECT_MODE_FULL }
+};
+
const int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
320, 240, 176, 144, 0, 0};
@@ -1389,7 +1394,10 @@
uint8_t *faceDetectMode =
(uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
- camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
+ uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP,
+ sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]),
+ *faceDetectMode);
+ camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1);
uint8_t *histogramMode =
(uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
@@ -1841,12 +1849,8 @@
staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
&gCamCapability[cameraId]->max_tone_map_curve_points, 1);
- /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
- (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
- /*hardcode 0 for now*/
- int32_t max_face_count = 0;
staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
- &max_face_count, 1);
+ (int*)&gCamCapability[cameraId]->max_num_roi, 1);
staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
&gCamCapability[cameraId]->histogram_size, 1);
@@ -1915,7 +1919,8 @@
&max3aRegions, 1);
uint8_t availableFaceDetectModes[] = {
- ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
+ ANDROID_STATISTICS_FACE_DETECT_MODE_OFF,
+ ANDROID_STATISTICS_FACE_DETECT_MODE_FULL };
staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
availableFaceDetectModes,
sizeof(availableFaceDetectModes));
@@ -3007,8 +3012,11 @@
}
if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
- uint8_t facedetectMode =
+ uint8_t fwk_facedetectMode =
frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
+ uint8_t facedetectMode =
+ lookupHalName(FACEDETECT_MODES_MAP,
+ sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode);
rc = AddSetParmEntryToBatch(mParameters,
CAM_INTF_META_STATS_FACEDETECT_MODE,
sizeof(facedetectMode), &facedetectMode);
diff --git a/camera/QCamera2/HAL3/QCamera3HWI.h b/camera/QCamera2/HAL3/QCamera3HWI.h
index 148e9eb..c4c7f29 100644
--- a/camera/QCamera2/HAL3/QCamera3HWI.h
+++ b/camera/QCamera2/HAL3/QCamera3HWI.h
@@ -223,6 +223,7 @@
static const QCameraMap ANTIBANDING_MODES_MAP[];
static const QCameraMap AE_FLASH_MODE_MAP[];
static const QCameraMap FLASH_MODES_MAP[];
+ static const QCameraMap FACEDETECT_MODES_MAP[];
static pthread_mutex_t mCameraSessionLock;
static unsigned int mCameraSessionActive;