Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(684)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/shapedetection/FaceDetectionImpl.java

Issue 2863553002: Shape Detection: run Android FaceDetector ops on background thread (Closed)
Patch Set: Use AsyncTask.THREAD_POOL_EXECUTOR.execute ISO a new Thread every time Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/public/android/java/src/org/chromium/content/browser/shapedetection/FaceDetectionImpl.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/shapedetection/FaceDetectionImpl.java b/content/public/android/java/src/org/chromium/content/browser/shapedetection/FaceDetectionImpl.java
index 17ff5506fbb5d171d838b16d1d25147d0d52b0c0..dfb6fb63638d82a86283d92caf6676979b6991e8 100644
--- a/content/public/android/java/src/org/chromium/content/browser/shapedetection/FaceDetectionImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/shapedetection/FaceDetectionImpl.java
@@ -8,6 +8,7 @@ import android.graphics.Bitmap;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
+import android.os.AsyncTask;
import org.chromium.base.Log;
import org.chromium.gfx.mojom.RectF;
@@ -36,8 +37,8 @@ public class FaceDetectionImpl implements FaceDetection {
}
@Override
- public void detect(
- SharedBufferHandle frameData, int width, int height, DetectResponse callback) {
+ public void detect(SharedBufferHandle frameData, final int width, final int height,
+ final DetectResponse callback) {
final long numPixels = (long) width * height;
// TODO(xianglu): https://crbug.com/670028 homogeneize overflow checking.
if (!frameData.isValid() || width <= 0 || height <= 0 || numPixels > (Long.MAX_VALUE / 4)) {
@@ -74,33 +75,40 @@ public class FaceDetectionImpl implements FaceDetection {
// http://androidxref.com/7.0.0_r1/xref/frameworks/base/graphics/java/android/graphics/Bitmap.java#538
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
- Bitmap unPremultipliedBitmap =
+ final Bitmap unPremultipliedBitmap =
Bitmap.createBitmap(pixels, width, height, Bitmap.Config.RGB_565);
- FaceDetector detector = new FaceDetector(width, height, mMaxFaces);
- Face[] detectedFaces = new Face[mMaxFaces];
- // findFaces() will stop at |mMaxFaces|.
- final int numberOfFaces = detector.findFaces(unPremultipliedBitmap, detectedFaces);
-
- FaceDetectionResult faceDetectionResult = new FaceDetectionResult();
- faceDetectionResult.boundingBoxes = new RectF[numberOfFaces];
- for (int i = 0; i < numberOfFaces; i++) {
- final Face face = detectedFaces[i];
- final PointF midPoint = new PointF();
- face.getMidPoint(midPoint);
- final float eyesDistance = face.eyesDistance();
-
- RectF boundingBox = new RectF();
- boundingBox.x = midPoint.x - eyesDistance;
- boundingBox.y = midPoint.y - eyesDistance;
- boundingBox.width = 2 * eyesDistance;
- boundingBox.height = 2 * eyesDistance;
-
- // TODO(xianglu): Consider adding Face.confidence and Face.pose.
- faceDetectionResult.boundingBoxes[i] = boundingBox;
- }
-
- callback.call(faceDetectionResult);
+ // FaceDetector creation and findFaces() might take a long time and trigger a
+ // "StrictMode policy violation": they should happen in a background thread.
+ AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
+ @Override
+ public void run() {
+ final FaceDetector detector = new FaceDetector(width, height, mMaxFaces);
+ Face[] detectedFaces = new Face[mMaxFaces];
+ // findFaces() will stop at |mMaxFaces|.
+ final int numberOfFaces = detector.findFaces(unPremultipliedBitmap, detectedFaces);
+
+ FaceDetectionResult faceDetectionResult = new FaceDetectionResult();
+ faceDetectionResult.boundingBoxes = new RectF[numberOfFaces];
+ for (int i = 0; i < numberOfFaces; i++) {
+ final Face face = detectedFaces[i];
+ final PointF midPoint = new PointF();
+ face.getMidPoint(midPoint);
+ final float eyesDistance = face.eyesDistance();
+
+ RectF boundingBox = new RectF();
+ boundingBox.x = midPoint.x - eyesDistance;
+ boundingBox.y = midPoint.y - eyesDistance;
+ boundingBox.width = 2 * eyesDistance;
+ boundingBox.height = 2 * eyesDistance;
+
+ // TODO(xianglu): Consider adding Face.confidence and Face.pose.
+ faceDetectionResult.boundingBoxes[i] = boundingBox;
+ }
+
+ callback.call(faceDetectionResult);
+ }
+ });
}
@Override
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698