package com.facepp.demo;
import android.app.Activity;
import android.content.Intent;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PreviewCallback;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.Matrix;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.facepp.demo.bean.FaceActionInfo;
import com.facepp.demo.bean.FeatureInfo;
import com.facepp.demo.facecompare.FaceCompareManager;
import com.facepp.demo.mediacodec.MediaHelper;
import com.facepp.demo.util.CameraMatrix;
import com.facepp.demo.util.ConUtil;
import com.facepp.demo.util.DialogUtil;
import com.facepp.demo.util.ICamera;
import com.facepp.demo.util.MediaRecorderUtil;
import com.facepp.demo.util.OpenGLDrawRect;
import com.facepp.demo.util.OpenGLUtil;
import com.facepp.demo.util.PointsMatrix;
import com.facepp.demo.util.Screen;
import com.facepp.demo.util.SensorEventUtil;
import com.megvii.facepp.sdk.Facepp;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class OpenglActivity extends Activity
implements PreviewCallback, Renderer, SurfaceTexture.OnFrameAvailableListener {
private boolean isStartRecorder, is3DPose, isDebug, isROIDetect, is106Points, isBackCamera, isFaceProperty,
isOneFaceTrackig, isFaceCompare, isShowFaceRect;
private String trackModel;
private int printTime = 31;
private GLSurfaceView mGlSurfaceView;
private ICamera mICamera;
private Camera mCamera;
private DialogUtil mDialogUtil;
private TextView debugInfoText, debugPrinttext, AttriButetext;
private TextView featureTargetText;
private ImageButton btnAddFeature;
private HandlerThread mHandlerThread = new HandlerThread("facepp");
private Handler mHandler;
private Facepp facepp;
private MediaRecorderUtil mediaRecorderUtil;
private int min_face_size = 200;
private int detection_interval = 25;
private HashMap<String, Integer> resolutionMap;
private SensorEventUtil sensorUtil;
private float roi_ratio = 0.8f;
private byte[] newestFeature;
private byte[] carmeraImgData;
private int screenWidth;
private int screenHeight;
private boolean isSurfaceCreated;
private FaceActionInfo faceActionInfo;
private ImageView imgIcon;
private MediaHelper mMediaHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Screen.initialize(this);
setContentView(R.layout.activity_opengl);
init();
// new Handler().postDelayed(new Runnable() {
// @Override
// public void run() {
// startRecorder();
// }
// }, 2000);
FaceCompareManager.instance().loadFeature(this);
ConUtil.toggleHideyBar(this);
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
screenWidth = outMetrics.widthPixels;
screenHeight = outMetrics.heightPixels;
}
private void init() {
if (android.os.Build.MODEL.equals("PLK-AL10"))
printTime = 50;
faceActionInfo = (FaceActionInfo) getIntent().getSerializableExtra("FaceAction");
isStartRecorder = faceActionInfo.isStartRecorder;
is3DPose = faceActionInfo.is3DPose;
isDebug = faceActionInfo.isdebug;
isROIDetect = faceActionInfo.isROIDetect;
is106Points = faceActionInfo.is106Points;
isBackCamera = faceActionInfo.isBackCamera;
isFaceProperty = faceActionInfo.isFaceProperty;
isOneFaceTrackig = faceActionInfo.isOneFaceTrackig;
isFaceCompare = faceActionInfo.isFaceCompare;
trackModel = faceActionInfo.trackModel;
min_face_size = faceActionInfo.faceSize;
detection_interval = faceActionInfo.interval;
resolutionMap = faceActionInfo.resolutionMap;
facepp = new Facepp();
sensorUtil = new SensorEventUtil(this);
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
mGlSurfaceView = (GLSurfaceView) findViewById(R.id.opengl_layout_surfaceview);
mGlSurfaceView.setEGLContextClientVersion(2);// 创建一个OpenGL ES 2.0
// context
mGlSurfaceView.setRenderer(this);// 设置渲染器进入gl
// RENDERMODE_CONTINUOUSLY不停渲染
// RENDERMODE_WHEN_DIRTY懒惰渲染,需要手动调用 glSurfaceView.requestRender() 才会进行更新
mGlSurfaceView.setRenderMode(mGlSurfaceView.RENDERMODE_WHEN_DIRTY);// 设置渲染器模式
mGlSurfaceView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
autoFocus();
}
});
mICamera = new ICamera();
mDialogUtil = new DialogUtil(this);
debugInfoText = (TextView) findViewById(R.id.opengl_layout_debugInfotext);
AttriButetext = (TextView) findViewById(R.id.opengl_layout_AttriButetext);
debugPrinttext = (TextView) findViewById(R.id.opengl_layout_debugPrinttext);
if (isDebug)
debugInfoText.setVisibility(View.VISIBLE);
else
debugInfoText.setVisibility(View.INVISIBLE);
btnAddFeature = (ImageButton) findViewById(R.id.opengl_layout_addFaceInfo);
btnAddFeature.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 保存feature数据
if (mICamera==null||mICamera.mCamera==null){
return;
}
if (compareFaces == null || compareFaces.length <= 0 || carmeraImgData == null) {
Toast.makeText(OpenglActivity.this, "当前未检测到人脸", Toast.LENGTH_SHORT).show();
return;
}
// Log.e("xie","xie rect"+compareFaces[0].rect.top+"bottom"+compareFaces[0].rect.bottom+newestFeature);
FaceCompareManager.instance().startActivity(OpenglActivity.this, compareFaces, mICamera, carmeraImgData, isBackCamera, faceActionInfo);
}
});
featureTargetText = (TextView) findViewById(R.id.opengl_layout_targetFaceName);
if (isFaceCompare) {
btnAddFeature.setVisibility(View.VISIBLE);
} else {
btnAddFeature.setVisibility(View.GONE);
}
imgIcon = (ImageView) findViewById(R.id.opengl_layout_icon);
}
/**
* 开始录制
*/
private void startRecorder() {
if (isStartRecorder) {
int Angle = 360 - mICamera.Angle;
if (isBackCamera)
Angle = mICamera.Angle;
mediaRecorderUtil = new MediaRecorderUtil(this, mCamera, mICamera.cameraWidth, mICamera.cameraHeight);
isStartRecorder = mediaRecorderUtil.prepareVideoRecorder(Angle);
if (isStartRecorder) {
boolean isRecordSucess = mediaRecorderUtil.start();
if (isRecordSucess)
mICamera.actionDetect(this);
else
mDialogUtil.showDialog(getResources().getString(R.string.no_record));
}
}
}
private void autoFocus() {
if (mCamera != null