package com.novoda.magicmirror.facerecognition;
import android.content.Context;
import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.MultiProcessor;
import com.google.android.gms.vision.face.FaceDetector;
import com.novoda.notils.logger.simple.Log;
import java.io.IOException;
public class FaceCameraSource implements FaceReactionSource {
private static final float CAMERA_SOURCE_REQUESTED_FPS = 30.0f;
private static final int CAMERA_SOURCE_WIDTH = 640;
private static final int CAMERA_SOURCE_HEIGHT = 360;
private CameraSource cameraSource;
private CameraSourcePreview preview;
public static FaceReactionSource createFrom(Context context,
FaceTracker.FaceListener faceListener,
CameraSourcePreview preview)
throws FaceDetectionUnavailableException {
FaceDetector detector = new FaceDetector.Builder(context)
.setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
.build();
detector.setProcessor(
new MultiProcessor.Builder<>(new FaceTracker.Factory(faceListener))
.build()
);
if (!detector.isOperational()) {
throw new FaceDetectionUnavailableException("Detector is not Operational");
}
CameraSource cameraSource = new CameraSource.Builder(context, detector)
.setRequestedPreviewSize(CAMERA_SOURCE_WIDTH, CAMERA_SOURCE_HEIGHT)
.setFacing(CameraSource.CAMERA_FACING_FRONT)
.setRequestedFps(CAMERA_SOURCE_REQUESTED_FPS)
.build();
return new FaceCameraSource(cameraSource, preview);
}
public FaceCameraSource(CameraSource cameraSource, CameraSourcePreview preview) {
this.cameraSource = cameraSource;
this.preview = preview;
}
@Override
public void start() {
try {
preview.start(cameraSource);
} catch (IOException e) {
Log.e(e, "Unable to start camera source.");
cameraSource.release();
}
}
@Override
public void release() {
cameraSource.release();
}
@Override
public boolean onKeyDown(int keyCode) {
return false;
}
@Override
public boolean onKeyUp(int keyCode) {
return false;
}
}