@@ -48,9 +48,16 @@ public class LegacyFaceDetectMapper {
4848 private static final boolean VERBOSE = Log .isLoggable (TAG , Log .VERBOSE );
4949
5050 private final Camera mCamera ;
51+ /** Is the camera capable of face detection? */
5152 private final boolean mFaceDetectSupported ;
53+ /** Is the camera is running face detection? */
5254 private boolean mFaceDetectEnabled = false ;
55+ /** Did the last request say to use SCENE_MODE = FACE_PRIORITY? */
56+ private boolean mFaceDetectScenePriority = false ;
57+ /** Did the last request enable the face detect mode to ON? */
58+ private boolean mFaceDetectReporting = false ;
5359
60+ /** Synchronize access to all fields */
5461 private final Object mLock = new Object ();
5562 private Camera .Face [] mFaces ;
5663 private Camera .Face [] mFacesPrev ;
@@ -129,6 +136,17 @@ public void processFaceDetectMode(CaptureRequest captureRequest,
129136 return ;
130137 }
131138
139+ /*
140+ * control.sceneMode
141+ */
142+ int sceneMode = ParamsUtils .getOrDefault (captureRequest , CONTROL_SCENE_MODE ,
143+ CONTROL_SCENE_MODE_DISABLED );
144+ if (sceneMode == CONTROL_SCENE_MODE_FACE_PRIORITY && !mFaceDetectSupported ) {
145+ Log .w (TAG , "processFaceDetectMode - ignoring control.sceneMode == FACE_PRIORITY; " +
146+ "face detection is not available" );
147+ return ;
148+ }
149+
132150 // Print some warnings out in case the values were wrong
133151 switch (fdMode ) {
134152 case STATISTICS_FACE_DETECT_MODE_OFF :
@@ -145,7 +163,8 @@ public void processFaceDetectMode(CaptureRequest captureRequest,
145163 return ;
146164 }
147165
148- boolean enableFaceDetect = fdMode != STATISTICS_FACE_DETECT_MODE_OFF ;
166+ boolean enableFaceDetect = (fdMode != STATISTICS_FACE_DETECT_MODE_OFF )
167+ || (sceneMode == CONTROL_SCENE_MODE_FACE_PRIORITY );
149168 synchronized (mLock ) {
150169 // Enable/disable face detection if it's changed since last time
151170 if (enableFaceDetect != mFaceDetectEnabled ) {
@@ -166,6 +185,8 @@ public void processFaceDetectMode(CaptureRequest captureRequest,
166185 }
167186
168187 mFaceDetectEnabled = enableFaceDetect ;
188+ mFaceDetectScenePriority = sceneMode == CONTROL_SCENE_MODE_FACE_PRIORITY ;
189+ mFaceDetectReporting = fdMode != STATISTICS_FACE_DETECT_MODE_OFF ;
169190 }
170191 }
171192 }
@@ -177,6 +198,10 @@ public void processFaceDetectMode(CaptureRequest captureRequest,
177198 * <p>Face detect callbacks are processed in the background, and each call to
178199 * {@link #mapResultFaces} will have the latest faces as reflected by the camera1 callbacks.</p>
179200 *
201+ * <p>If the scene mode was set to {@code FACE_PRIORITY} but face detection is disabled,
202+ * the camera will still run face detection in the background, but no faces will be reported
203+ * in the capture result.</p>
204+ *
180205 * @param result a non-{@code null} result
181206 * @param legacyRequest a non-{@code null} request (read-only)
182207 */
@@ -186,16 +211,19 @@ public void mapResultFaces(CameraMetadataNative result, LegacyRequest legacyRequ
186211
187212 Camera .Face [] faces , previousFaces ;
188213 int fdMode ;
214+ boolean fdScenePriority ;
189215 synchronized (mLock ) {
190- fdMode = mFaceDetectEnabled ?
216+ fdMode = mFaceDetectReporting ?
191217 STATISTICS_FACE_DETECT_MODE_SIMPLE : STATISTICS_FACE_DETECT_MODE_OFF ;
192218
193- if (mFaceDetectEnabled ) {
219+ if (mFaceDetectReporting ) {
194220 faces = mFaces ;
195221 } else {
196222 faces = null ;
197223 }
198224
225+ fdScenePriority = mFaceDetectScenePriority ;
226+
199227 previousFaces = mFacesPrev ;
200228 mFacesPrev = faces ;
201229 }
@@ -227,5 +255,10 @@ public void mapResultFaces(CameraMetadataNative result, LegacyRequest legacyRequ
227255
228256 result .set (CaptureResult .STATISTICS_FACES , convertedFaces .toArray (new Face [0 ]));
229257 result .set (CaptureResult .STATISTICS_FACE_DETECT_MODE , fdMode );
258+
259+ // Override scene mode with FACE_PRIORITY if the request was using FACE_PRIORITY
260+ if (fdScenePriority ) {
261+ result .set (CaptureResult .CONTROL_SCENE_MODE , CONTROL_SCENE_MODE_FACE_PRIORITY );
262+ }
230263 }
231264}
0 commit comments