From ec8173bc779d50a81aefead62798090bab2b254e Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Thu, 25 Feb 2016 14:23:02 -0800 Subject: SnapdragonCamera: Add face detection icon to video Add video face detection to developer option CRs-Fixed: 978207 Change-Id: I9308573a5a1004fc3803a955bc96f495ecbfc6c7 --- res/layout/video_module.xml | 10 ++++ res/xml/video_preferences.xml | 7 +++ src/com/android/camera/VideoMenu.java | 1 + src/com/android/camera/VideoModule.java | 52 +++++++++++++++++++++ src/com/android/camera/VideoUI.java | 82 ++++++++++++++++++++++++++++++++- 5 files changed, 150 insertions(+), 2 deletions(-) diff --git a/res/layout/video_module.xml b/res/layout/video_module.xml index 561539e08..c6a9d7e80 100644 --- a/res/layout/video_module.xml +++ b/res/layout/video_module.xml @@ -28,6 +28,16 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> + + + + 0) { + mFaceDetectionStarted = true; + CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId]; + mUI.onStartFaceDetection(mCameraDisplayOrientation, + (info.facing == CameraInfo.CAMERA_FACING_FRONT)); + mCameraDevice.setFaceDetectionCallback(mHandler, mUI); + Log.d(TAG, "start face detection Video "+mParameters.getMaxNumDetectedFaces()); + mCameraDevice.startFaceDetection(); + } + } + + public void stopFaceDetection() { + Log.d(TAG, "stop face detection"); + if (mFaceDetectionEnabled == false || !mFaceDetectionStarted) return; + if (mParameters.getMaxNumDetectedFaces() > 0) { + mFaceDetectionStarted = false; + mCameraDevice.setFaceDetectionCallback(null, null); + mUI.pauseFaceDetection(); + mCameraDevice.stopFaceDetection(); + mUI.onStopFaceDetection(); + } + } } diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index 6a8612cad..01a7f70a9 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -26,6 +26,7 @@ import android.graphics.Color; import android.graphics.Point; import android.graphics.drawable.ColorDrawable; import android.hardware.Camera.Parameters; +import android.hardware.Camera.Face; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; @@ -35,6 +36,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.ViewGroup; +import android.view.ViewStub; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.ImageView; @@ -44,10 +46,13 @@ import android.widget.PopupWindow; import android.widget.TextView; import android.view.View.OnLayoutChangeListener; +import com.android.camera.CameraManager.CameraProxy; import com.android.camera.CameraPreference.OnPreferenceChangedListener; +import com.android.camera.PhotoUI.SurfaceTextureSizeChangedListener; import com.android.camera.ui.AbstractSettingPopup; import com.android.camera.ui.CameraControls; import com.android.camera.ui.CameraRootView; +import com.android.camera.ui.FaceView; import com.android.camera.ui.ListSubMenu; import com.android.camera.ui.ModuleSwitcher; import com.android.camera.ui.PieRenderer; @@ -62,7 +67,8 @@ public class VideoUI implements PieRenderer.PieListener, PreviewGestures.SingleTapListener, CameraRootView.MyDisplayListener, SurfaceHolder.Callback, - PauseButton.OnPauseButtonListener { + PauseButton.OnPauseButtonListener, + CameraManager.CameraFaceDetectionCallback{ private static final String TAG = "CAM_VideoUI"; // module fields private final FocusRing mFocusRing; @@ -123,6 +129,12 @@ public class VideoUI implements PieRenderer.PieListener, SURFACE_VIEW; } + //Face detection + private FaceView mFaceView; + private SurfaceTextureSizeChangedListener mSurfaceTextureSizeListener; + private float mSurfaceTextureUncroppedWidth; + private float mSurfaceTextureUncroppedHeight; + public void showPreviewCover() { mPreviewCover.setVisibility(View.VISIBLE); } @@ -248,6 +260,15 @@ public class VideoUI implements PieRenderer.PieListener, initializeOverlay(); initializeControlByIntent(); initializePauseButton(); + + mCameraControls = (CameraControls) mRootView.findViewById(R.id.camera_controls); + ViewStub faceViewStub = (ViewStub) mRootView + .findViewById(R.id.face_view_stub); + if (faceViewStub != null) { + faceViewStub.inflate(); + mFaceView = (FaceView) mRootView.findViewById(R.id.face_view); + setSurfaceTextureSizeChangedListener(mFaceView); + } mAnimationManager = new AnimationManager(); mOrientationResize = false; mPrevOrientationResize = false; @@ -271,6 +292,10 @@ public class VideoUI implements PieRenderer.PieListener, mOrientationResize = orientation; } + public void setSurfaceTextureSizeChangedListener(SurfaceTextureSizeChangedListener listener) { + mSurfaceTextureSizeListener = listener; + } + public void initializeSurfaceView() { if (mSurfaceView == null) { mSurfaceView = new SurfaceView(mActivity); @@ -381,7 +406,7 @@ public class VideoUI implements PieRenderer.PieListener, scaledTextureHeight = l * 3 / 4; break; } - } else if (mMaxPreviewWidth != 0 && mMaxPreviewHeight != 0) { + } else { float width = mMaxPreviewWidth, height = mMaxPreviewHeight; if (mOrientationResize) { scaledTextureWidth = height * mAspectRatio; @@ -425,9 +450,27 @@ public class VideoUI implements PieRenderer.PieListener, } } + if (mSurfaceTextureUncroppedWidth != scaledTextureWidth || + mSurfaceTextureUncroppedHeight != scaledTextureHeight) { + mSurfaceTextureUncroppedWidth = scaledTextureWidth; + mSurfaceTextureUncroppedHeight = scaledTextureHeight; + if (mSurfaceTextureSizeListener != null) { + mSurfaceTextureSizeListener.onSurfaceTextureSizeChanged( + (int) mSurfaceTextureUncroppedWidth, + (int) mSurfaceTextureUncroppedHeight); + Log.d(TAG, "mSurfaceTextureUncroppedWidth=" + mSurfaceTextureUncroppedWidth + + "mSurfaceTextureUncroppedHeight=" + mSurfaceTextureUncroppedHeight); + } + } + + if(lp != null) { mSurfaceView.setLayoutParams(lp); mSurfaceView.requestLayout(); + if (mFaceView != null) { + mFaceView.setLayoutParams(lp); + } + } if (scaledTextureWidth > 0 && scaledTextureHeight > 0) { @@ -538,6 +581,10 @@ public class VideoUI implements PieRenderer.PieListener, } public void setDisplayOrientation(int orientation) { + if (mFaceView != null) { + mFaceView.setDisplayOrientation(orientation); + } + if ((mPreviewOrientation == -1 || mPreviewOrientation != orientation) && mVideoMenu != null && mVideoMenu.isPreviewMenuBeingShown()) { dismissSceneModeMenu(); @@ -1149,4 +1196,35 @@ public class VideoUI implements PieRenderer.PieListener, public FocusRing getFocusRing() { return mFocusRing; } + + @Override + public void onFaceDetection(Face[] faces, CameraProxy camera) { + Log.d(TAG, "onFacedetectopmn"); + mFaceView.setFaces(faces); + } + + public void pauseFaceDetection() { + if (mFaceView != null) mFaceView.pause(); + } + + public void resumeFaceDetection() { + if (mFaceView != null) mFaceView.resume(); + } + + public void onStartFaceDetection(int orientation, boolean mirror) { + mFaceView.setBlockDraw(false); + mFaceView.clear(); + mFaceView.setVisibility(View.VISIBLE); + mFaceView.setDisplayOrientation(orientation); + mFaceView.setMirror(mirror); + mFaceView.resume(); + } + + public void onStopFaceDetection() { + if (mFaceView != null) { + mFaceView.setBlockDraw(true); + mFaceView.clear(); + } +>>>>>>> 7252fd0... SnapdragonCamera: Add face detection icon to video + } } -- cgit v1.2.3