diff options
Diffstat (limited to 'src/com/android/camera/CaptureModule.java')
-rw-r--r-- | src/com/android/camera/CaptureModule.java | 357 |
1 files changed, 206 insertions, 151 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index baf8b843c..bf63de271 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -68,6 +68,7 @@ import android.view.KeyEvent; import android.view.OrientationEventListener; import android.view.Surface; import android.view.SurfaceHolder; +import android.view.SurfaceView; import android.view.View; import android.widget.Toast; @@ -80,6 +81,7 @@ import com.android.camera.imageprocessor.filter.SharpshooterFilter; import com.android.camera.ui.CountDownView; import com.android.camera.ui.ModuleSwitcher; import com.android.camera.ui.RotateTextToast; +import com.android.camera.ui.TrackingFocusRenderer; import com.android.camera.util.CameraUtil; import com.android.camera.util.PersistUtil; import com.android.camera.util.SettingTranslation; @@ -180,7 +182,7 @@ public class CaptureModule implements CameraModule, PhotoController, // The degrees of the device rotated clockwise from its natural orientation. private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN; private boolean mFirstTimeInitialized; - private boolean mInitialized = false; + private boolean mCamerasOpened = false; private boolean mIsLinked = false; private long mCaptureStartTime; private boolean mPaused = true; @@ -200,6 +202,7 @@ public class CaptureModule implements CameraModule, PhotoController, private CameraCharacteristics mMainCameraCharacteristics; private int mDisplayRotation; private int mDisplayOrientation; + private boolean mIsRefocus = false; /** * A {@link CameraCaptureSession } for camera preview. @@ -217,7 +220,6 @@ public class CaptureModule implements CameraModule, PhotoController, */ private PostProcessor mPostProcessor; private FrameProcessor mFrameProcessor; - private Size mFrameProcPreviewOutputSize; private CaptureResult mPreviewCaptureResult; private Face[] mPreviewFaces = null; private Face[] mStickyFaces = null; @@ -241,7 +243,6 @@ public class CaptureModule implements CameraModule, PhotoController, private CameraCaptureSession mCurrentSession; private Size mPreviewSize; private Size mPictureSize; - private Size mVideoPreviewSize; private Size mVideoSize; private Size mVideoSnapshotSize; @@ -399,13 +400,14 @@ public class CaptureModule implements CameraModule, PhotoController, }); mFirstPreviewLoaded = true; } - - Face[] faces = result.get(CaptureResult.STATISTICS_FACES); - mPreviewFaces = faces; - if(faces != null && faces.length != 0) { - mStickyFaces = faces; + if (id == getMainCameraId()) { + Face[] faces = result.get(CaptureResult.STATISTICS_FACES); + mPreviewFaces = faces; + if (faces != null && faces.length != 0) { + mStickyFaces = faces; + } + mPreviewCaptureResult = result; } - mPreviewCaptureResult = result; updateCaptureStateMachine(id, result); } @@ -442,23 +444,23 @@ public class CaptureModule implements CameraModule, PhotoController, if (mPaused) { return; } + + mCameraDevice[id] = cameraDevice; + mCameraOpened[id] = true; + if (isBackCamera() && getCameraMode() == DUAL_MODE && id == BAYER_ID) { Message msg = mCameraHandler.obtainMessage(OPEN_CAMERA, MONO_ID); mCameraHandler.sendMessage(msg); - } - if (!mInitialized) { - mInitialized = true; + } else { + mCamerasOpened = true; mActivity.runOnUiThread(new Runnable() { @Override public void run() { mUI.onCameraOpened(mCameraIdList); } }); + createSessions(); } - - mCameraDevice[id] = cameraDevice; - mCameraOpened[id] = true; - createSession(id); } @Override @@ -466,8 +468,9 @@ public class CaptureModule implements CameraModule, PhotoController, int id = Integer.parseInt(cameraDevice.getId()); Log.d(TAG, "onDisconnected " + id); cameraDevice.close(); - mCameraDevice = null; + mCameraDevice[id] = null; mCameraOpenCloseLock.release(); + mCamerasOpened = false; } @Override @@ -477,6 +480,7 @@ public class CaptureModule implements CameraModule, PhotoController, cameraDevice.close(); mCameraDevice[id] = null; mCameraOpenCloseLock.release(); + mCamerasOpened = false; if (null != mActivity) { mActivity.finish(); } @@ -488,6 +492,7 @@ public class CaptureModule implements CameraModule, PhotoController, Log.d(TAG, "onClosed " + id); mCameraDevice[id] = null; mCameraOpenCloseLock.release(); + mCamerasOpened = false; } }; @@ -662,6 +667,26 @@ public class CaptureModule implements CameraModule, PhotoController, } } + private void createSessions() { + if (mPaused || !mCamerasOpened || !mSurfaceReady) return; + if (isBackCamera()) { + switch (getCameraMode()) { + case DUAL_MODE: + createSession(BAYER_ID); + createSession(MONO_ID); + break; + case BAYER_MODE: + createSession(BAYER_ID); + break; + case MONO_MODE: + createSession(MONO_ID); + break; + } + } else { + createSession(FRONT_ID); + } + } + private void createSession(final int id) { if (mPaused || !mCameraOpened[id] || !mSurfaceReady) return; Log.d(TAG, "createSession " + id); @@ -683,7 +708,9 @@ public class CaptureModule implements CameraModule, PhotoController, } // When the session is ready, we start displaying the preview. mCaptureSession[id] = cameraCaptureSession; - mCurrentSession = cameraCaptureSession; + if(id == getMainCameraId()) { + mCurrentSession = cameraCaptureSession; + } initializePreviewConfiguration(id); setDisplayOrientation(); updateFaceDetection(); @@ -705,7 +732,7 @@ public class CaptureModule implements CameraModule, PhotoController, @Override public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) { - Log.e(TAG, "cameracapturesession - onConfigureFailed"); + Log.e(TAG, "cameracapturesession - onConfigureFailed "+id); new AlertDialog.Builder(mActivity) .setTitle("Camera Initialization Failed") .setMessage("Closing SnapdragonCamera") @@ -726,6 +753,11 @@ public class CaptureModule implements CameraModule, PhotoController, } }; + if(id == getMainCameraId()) { + mFrameProcessor.init(mPreviewSize); + mFrameProcessor.setOutputSurface(surface); + } + if(isClearSightOn()) { mPreviewRequestBuilder[id].addTarget(surface); list.add(surface); @@ -733,16 +765,17 @@ public class CaptureModule implements CameraModule, PhotoController, id == BAYER_ID, mCameraDevice[id], list, captureSessionCallback); } else if (id == getMainCameraId()) { if(mFrameProcessor.isFrameFilterEnabled()) { - mFrameProcessor.init(mFrameProcPreviewOutputSize); mActivity.runOnUiThread(new Runnable() { public void run() { - mUI.getSurfaceHolder().setFixedSize(mFrameProcPreviewOutputSize.getHeight(), mFrameProcPreviewOutputSize.getWidth()); + mUI.getSurfaceHolder().setFixedSize(mPreviewSize.getHeight(), mPreviewSize.getWidth()); } }); } - mFrameProcessor.setOutputSurface(surface); - mPreviewRequestBuilder[id].addTarget(mFrameProcessor.getInputSurface()); - list.add(mFrameProcessor.getInputSurface()); + List<Surface> surfaces = mFrameProcessor.getInputSurfaces(); + for(Surface surs : surfaces) { + mPreviewRequestBuilder[id].addTarget(surs); + list.add(surs); + } list.add(mImageReader[id].getSurface()); mCameraDevice[id].createCaptureSession(list, captureSessionCallback, null); } else { @@ -756,11 +789,23 @@ public class CaptureModule implements CameraModule, PhotoController, } } - private void setAFModeToPreview(int id, int afMode) { + public void setAFModeToPreview(int id, int afMode) { Log.d(TAG, "setAFModeToPreview " + afMode); mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AF_MODE, afMode); applyAFRegions(mPreviewRequestBuilder[id], id); applyAERegions(mPreviewRequestBuilder[id], id); + mPreviewRequestBuilder[id].setTag(id); + try { + mCaptureSession[id].setRepeatingRequest(mPreviewRequestBuilder[id] + .build(), mCaptureCallback, mCameraHandler); + } catch (CameraAccessException e) { + e.printStackTrace(); + } + } + + public void setFocusDistanceToPreview(int id, float fd) { + mPreviewRequestBuilder[id].set(CaptureRequest.LENS_FOCUS_DISTANCE, fd); + mPreviewRequestBuilder[id].setTag(id); try { mCaptureSession[id].setRepeatingRequest(mPreviewRequestBuilder[id] .build(), mCaptureCallback, mCameraHandler); @@ -774,6 +819,10 @@ public class CaptureModule implements CameraModule, PhotoController, mSettingsManager.reinit(getMainCameraId()); } + public boolean isRefocus() { + return mIsRefocus; + } + public boolean getRecordLocation() { String value = mSettingsManager.getValue(SettingsManager.KEY_RECORD_LOCATION); if (value == null) value = RecordLocationPreference.VALUE_NONE; @@ -857,7 +906,7 @@ public class CaptureModule implements CameraModule, PhotoController, CaptureRequest.Builder builder = mCameraDevice[id].createCaptureRequest(CameraDevice .TEMPLATE_PREVIEW); builder.setTag(id); - builder.addTarget(getPreviewSurface(id)); + addPreviewSurface(builder, null, id); applySettingsForLockFocus(builder, id); CaptureRequest request = builder.build(); @@ -879,7 +928,7 @@ public class CaptureModule implements CameraModule, PhotoController, CaptureRequest.Builder builder = mCameraDevice[id].createCaptureRequest(CameraDevice .TEMPLATE_PREVIEW); builder.setTag(id); - builder.addTarget(getPreviewSurface(id)); + addPreviewSurface(builder, null, id); mControlAFMode = CaptureRequest.CONTROL_AF_MODE_AUTO; applySettingsForAutoFocus(builder, id); @@ -914,9 +963,32 @@ public class CaptureModule implements CameraModule, PhotoController, mPreviewRequestBuilder[id].set(BayerMonoLinkEnableKey, (byte) 0); } } - private void captureStillPicture(final int id) { Log.d(TAG, "captureStillPicture " + id); + mIsRefocus = false; + CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { + + @Override + public void onCaptureCompleted(CameraCaptureSession session, + CaptureRequest request, + TotalCaptureResult result) { + Log.d(TAG, "captureStillPicture onCaptureCompleted: " + id); + } + + @Override + public void onCaptureFailed(CameraCaptureSession session, + CaptureRequest request, + CaptureFailure result) { + Log.d(TAG, "captureStillPicture onCaptureFailed: " + id); + } + + @Override + public void onCaptureSequenceCompleted(CameraCaptureSession session, int + sequenceId, long frameNumber) { + Log.d(TAG, "captureStillPicture onCaptureSequenceCompleted: " + id); + unlockFocus(id); + } + }; try { if (null == mActivity || null == mCameraDevice[id]) { warningToast("Camera is not ready yet to take a picture."); @@ -935,7 +1007,7 @@ public class CaptureModule implements CameraModule, PhotoController, captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, CameraUtil.getJpegRotation(id, mOrientation)); captureBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); - captureBuilder.addTarget(getPreviewSurface(id)); + addPreviewSurface(captureBuilder, null, id); captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode); captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_IDLE); applySettingsForCapture(captureBuilder, id); @@ -944,31 +1016,14 @@ public class CaptureModule implements CameraModule, PhotoController, ClearSightImageProcessor.getInstance().capture( id==BAYER_ID, mCaptureSession[id], captureBuilder, mCaptureCallbackHandler); } else if(id == getMainCameraId() && mPostProcessor.isFilterOn()) { + mCaptureSession[id].stopRepeating(); captureBuilder.addTarget(mImageReader[id].getSurface()); - List<CaptureRequest> captureList = mPostProcessor.setRequiredImages(captureBuilder); - mCaptureSession[id].captureBurst(captureList, new CameraCaptureSession.CaptureCallback() { - - @Override - public void onCaptureCompleted(CameraCaptureSession session, - CaptureRequest request, - TotalCaptureResult result) { - Log.d(TAG, "captureStillPicture onCaptureCompleted: " + id); - } - - @Override - public void onCaptureFailed(CameraCaptureSession session, - CaptureRequest request, - CaptureFailure result) { - Log.d(TAG, "captureStillPicture onCaptureFailed: " + id); - } - - @Override - public void onCaptureSequenceCompleted(CameraCaptureSession session, int - sequenceId, long frameNumber) { - Log.d(TAG, "captureStillPicture onCaptureSequenceCompleted: " + id); - unlockFocus(id); - } - }, mCaptureCallbackHandler); + if(mPostProcessor.isManualMode()) { + mPostProcessor.manualCapture(captureBuilder, mCaptureSession[id], captureCallback, mCaptureCallbackHandler); + } else { + List<CaptureRequest> captureList = mPostProcessor.setRequiredImages(captureBuilder); + mCaptureSession[id].captureBurst(captureList, captureCallback, mCaptureCallbackHandler); + } } else { captureBuilder.addTarget(mImageReader[id].getSurface()); mCaptureSession[id].stopRepeating(); @@ -1107,7 +1162,7 @@ public class CaptureModule implements CameraModule, PhotoController, CaptureRequest.Builder builder = mCameraDevice[id].createCaptureRequest(CameraDevice .TEMPLATE_PREVIEW); builder.setTag(id); - builder.addTarget(getPreviewSurface(id)); + addPreviewSurface(builder, null, id); applySettingsForPrecapture(builder, id); CaptureRequest request = builder.build(); mPrecaptureRequestHashCode[id] = request.hashCode(); @@ -1118,36 +1173,6 @@ public class CaptureModule implements CameraModule, PhotoController, } } - private void determineFrameProcPreviewOutputSize(List<Size> sizeList, float targetRatio) { - Display display = mActivity.getWindowManager().getDefaultDisplay(); - Point ds = new Point(); - display.getSize(ds); - int i=0, j=0, width, height; - float ratio; - for(; i < sizeList.size(); i++) { - width = sizeList.get(i).getHeight(); - height = sizeList.get(i).getWidth(); - ratio = (float)height/width; - if(ds.x >= width || ds.y >= height) { - if(j == 0) { - j = i; - } - if(ratio < targetRatio + 0.2f && ratio > targetRatio - 0.2f) { - break; - } - } - } - if(i == sizeList.size()) { - if(j != 0) { - mFrameProcPreviewOutputSize = sizeList.get(j); - } else { - mFrameProcPreviewOutputSize = sizeList.get(sizeList.size()-1); - } - } else { - mFrameProcPreviewOutputSize = sizeList.get(i); - } - } - public CameraCharacteristics getMainCameraCharacteristics() { return mMainCameraCharacteristics; } @@ -1181,19 +1206,6 @@ public class CaptureModule implements CameraModule, PhotoController, } mCameraId[i] = cameraId; - if (i == getMainCameraId()) { - String pictureSize = mSettingsManager.getValue(SettingsManager - .KEY_PICTURE_SIZE); - - Size size = parsePictureSize(pictureSize); - - Point screenSize = new Point(); - mActivity.getWindowManager().getDefaultDisplay().getSize(screenSize); - Size[] prevSizes = map.getOutputSizes(imageFormat); - mFrameProcPreviewOutputSize = getOptimalPreviewSize(size, prevSizes, screenSize.x, - screenSize.y); - } - if (isClearSightOn()) { if(i == getMainCameraId()) { ClearSightImageProcessor.getInstance().init(mPictureSize.getWidth(), @@ -1204,12 +1216,9 @@ public class CaptureModule implements CameraModule, PhotoController, // No Clearsight mImageReader[i] = ImageReader.newInstance(mPictureSize.getWidth(), mPictureSize.getHeight(), imageFormat, MAX_IMAGE_NUM); - if(mPostProcessor.isFilterOn() && i == getMainCameraId()) { + if((mPostProcessor.isFilterOn() || getFrameFilters().size() != 0) + && i == getMainCameraId()) { mImageReader[i].setOnImageAvailableListener(mPostProcessor, mImageAvailableHandler); -// if(mFrameProcessor.isFrameFilterEnabled()) { -// determineFrameProcPreviewOutputSize(Arrays.asList(map.getOutputSizes(imageFormat)), -// (float) size.getWidth() / (float) size.getHeight()); -// } } else { mImageReader[i].setOnImageAvailableListener(new ImageAvailableListener(i) { @Override @@ -1284,7 +1293,7 @@ public class CaptureModule implements CameraModule, PhotoController, CaptureRequest.Builder builder = mCameraDevice[id].createCaptureRequest(CameraDevice .TEMPLATE_PREVIEW); builder.setTag(id); - builder.addTarget(getPreviewSurface(id)); + addPreviewSurface(builder, null, id); applySettingsForUnlockFocus(builder, id); mCaptureSession[id].capture(builder.build(), mCaptureCallback, mCameraHandler); @@ -1327,7 +1336,7 @@ public class CaptureModule implements CameraModule, PhotoController, for (int i = 0; i < MAX_NUM_CAM; i++) { if (null != mCaptureSession[i]) { - if (mIsLinked) { + if (mIsLinked && mCamerasOpened) { unLinkBayerMono(i); try { mCaptureSession[i].capture(mPreviewRequestBuilder[i].build(), null, @@ -1549,20 +1558,36 @@ public class CaptureModule implements CameraModule, PhotoController, } private ArrayList<Integer> getFrameProcFilterId() { - String scene = mSettingsManager.getValue(SettingsManager.KEY_MAKEUP); ArrayList<Integer> filters = new ArrayList<Integer>(); + + String scene = mSettingsManager.getValue(SettingsManager.KEY_MAKEUP); if(scene != null && scene.equalsIgnoreCase("on")) { filters.add(FrameProcessor.FILTER_MAKEUP); } + String trackingFocus = mSettingsManager.getValue(SettingsManager.KEY_TRACKINGFOCUS); + if(trackingFocus != null && trackingFocus.equalsIgnoreCase("on")) { + filters.add(FrameProcessor.LISTENER_TRACKING_FOCUS); + } return filters; } + public void setRefocusLastTaken(final boolean value) { + mIsRefocus = value; + mActivity.runOnUiThread(new Runnable() { + public void run() { + mUI.showRefocusToast(value); + } + }); + } + private int getPostProcFilterId(int mode) { if (mode == SettingsManager.SCENE_MODE_OPTIZOOM_INT) { return PostProcessor.FILTER_OPTIZOOM; } else if (mode == SettingsManager.SCENE_MODE_NIGHT_INT && SharpshooterFilter.isSupportedStatic()) { return PostProcessor.FILTER_SHARPSHOOTER; + } else if (mode == SettingsManager.SCENE_MODE_UBIFOCUS_INT) { + return PostProcessor.FILTER_UBIFOCUS; } return PostProcessor.FILTER_NONE; } @@ -1598,7 +1623,7 @@ public class CaptureModule implements CameraModule, PhotoController, mFrameProcessor.onOpen(getFrameProcFilterId()); } - if(mPostProcessor.isFilterOn()) { + if(mPostProcessor.isFilterOn() || getFrameFilters().size() != 0) { setUpCameraOutputs(ImageFormat.YUV_420_888); } else { setUpCameraOutputs(ImageFormat.JPEG); @@ -1760,7 +1785,7 @@ public class CaptureModule implements CameraModule, PhotoController, @Override public void onSingleTapUp(View view, int x, int y) { - if (mPaused || mCameraDevice == null || !mFirstTimeInitialized || !mAutoFocusRegionSupported + if (mPaused || !mCamerasOpened || !mFirstTimeInitialized || !mAutoFocusRegionSupported || !mAutoExposureRegionSupported || !isTouchToFocusAllowed()) { return; } @@ -1879,22 +1904,7 @@ public class CaptureModule implements CameraModule, PhotoController, } Log.d(TAG, "onPreviewUIReady"); mSurfaceReady = true; - if (isBackCamera()) { - switch (getCameraMode()) { - case DUAL_MODE: - createSession(BAYER_ID); - createSession(MONO_ID); - break; - case BAYER_MODE: - createSession(BAYER_ID); - break; - case MONO_MODE: - createSession(MONO_ID); - break; - } - } else { - createSession(FRONT_ID); - } + createSessions(); } @Override @@ -2008,11 +2018,6 @@ public class CaptureModule implements CameraModule, PhotoController, private void updateVideoSize() { String videoSize = mSettingsManager.getValue(SettingsManager.KEY_VIDEO_QUALITY); mVideoSize = parsePictureSize(videoSize); - Point screenSize = new Point(); - mActivity.getWindowManager().getDefaultDisplay().getSize(screenSize); - Size[] prevSizes = mSettingsManager.getSupportedOutputSize(getMainCameraId(), - MediaRecorder.class); - mVideoPreviewSize = getOptimalPreviewSize(mVideoSize, prevSizes, screenSize.x, screenSize.y); } private void updateVideoSnapshotSize() { @@ -2050,8 +2055,8 @@ public class CaptureModule implements CameraModule, PhotoController, mState[cameraId] = STATE_PREVIEW; mControlAFMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE; closePreviewSession(); - boolean changed = mUI.setPreviewSize(mVideoPreviewSize.getWidth(), mVideoPreviewSize - .getHeight()); + mFrameProcessor.onClose(); + boolean changed = mUI.setPreviewSize(mVideoSize.getWidth(), mVideoSize.getHeight()); if (changed) { mUI.hideSurfaceView(); mUI.showSurfaceView(); @@ -2064,11 +2069,18 @@ public class CaptureModule implements CameraModule, PhotoController, .createCaptureRequest(CameraDevice.TEMPLATE_RECORD); List<Surface> surfaces = new ArrayList<>(); - Surface previewSurface = getPreviewSurface(cameraId); - surfaces.add(previewSurface); - mPreviewBuilder.addTarget(previewSurface); - surfaces.add(mMediaRecorder.getSurface()); - mPreviewBuilder.addTarget(mMediaRecorder.getSurface()); + Surface surface = getPreviewSurfaceForSession(cameraId); + mFrameProcessor.init(mVideoSize); + if(mFrameProcessor.isFrameFilterEnabled()) { + mActivity.runOnUiThread(new Runnable() { + public void run() { + mUI.getSurfaceHolder().setFixedSize(mVideoSize.getHeight(), mVideoSize.getWidth()); + } + }); + } + mFrameProcessor.setOutputSurface(surface); + mFrameProcessor.setVideoOutputSurface(mMediaRecorder.getSurface()); + addPreviewSurface(mPreviewBuilder, surfaces, cameraId); surfaces.add(mVideoSnapshotImageReader.getSurface()); mCameraDevice[cameraId].createCaptureSession(surfaces, new CameraCaptureSession @@ -2244,12 +2256,13 @@ public class CaptureModule implements CameraModule, PhotoController, Log.d(TAG, "stopRecordingVideo " + cameraId); // Stop recording + mFrameProcessor.onClose(); + mFrameProcessor.setVideoOutputSurface(null); closePreviewSession(); mMediaRecorder.stop(); mMediaRecorder.reset(); saveVideo(); - mUI.showRecordingUI(false); mIsRecordingVideo = false; boolean changed = mUI.setPreviewSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); @@ -2357,9 +2370,13 @@ public class CaptureModule implements CameraModule, PhotoController, String fileName = generateVideoFilename(outputFormat); Log.v(TAG, "New video filename: " + fileName); mMediaRecorder.setOutputFile(fileName); - mMediaRecorder.setVideoEncodingBitRate(mProfile.videoBitRate); mMediaRecorder.setVideoFrameRate(mProfile.videoFrameRate); - mMediaRecorder.setVideoSize(mProfile.videoFrameWidth, mProfile.videoFrameHeight); + mMediaRecorder.setVideoEncodingBitRate(mProfile.videoBitRate); + if(mFrameProcessor.isFrameFilterEnabled()) { + mMediaRecorder.setVideoSize(mProfile.videoFrameHeight, mProfile.videoFrameWidth); + } else { + mMediaRecorder.setVideoSize(mProfile.videoFrameWidth, mProfile.videoFrameHeight); + } mMediaRecorder.setVideoEncoder(videoEncoder); if (!mCaptureTimeLapse) { mMediaRecorder.setAudioEncodingBitRate(mProfile.audioBitRate); @@ -2383,7 +2400,11 @@ public class CaptureModule implements CameraModule, PhotoController, rotation += Integer.parseInt(videoRotation); rotation = rotation % 360; } - mMediaRecorder.setOrientationHint(rotation); + if(mFrameProcessor.isFrameFilterEnabled()) { + mMediaRecorder.setOrientationHint(0); + } else { + mMediaRecorder.setOrientationHint(rotation); + } mMediaRecorder.prepare(); } @@ -2418,7 +2439,8 @@ public class CaptureModule implements CameraModule, PhotoController, if (seconds > 0) { mUI.startCountDown(seconds, true); } else { - if (mPostProcessor.isFilterOn() && mPostProcessor.isItBusy()) { + if((mPostProcessor.isFilterOn() || getFrameFilters().size() != 0) + && mPostProcessor.isItBusy()) { warningToast("It's still busy processing previous scene mode request."); return; } @@ -2717,22 +2739,29 @@ public class CaptureModule implements CameraModule, PhotoController, } } - private Surface getPreviewSurface(int id) { - if (isBackCamera()) { - if (getCameraMode() == DUAL_MODE && id == MONO_ID) { - return mUI.getSurfaceHolder2().getSurface(); - } else { - return mFrameProcessor.getInputSurface(); + private void addPreviewSurface(CaptureRequest.Builder builder, List<Surface> surfaceList, int id) { + if (isBackCamera() && getCameraMode() == DUAL_MODE && id == MONO_ID) { + if(surfaceList != null) { + surfaceList.add(mUI.getMonoDummySurface()); } + builder.addTarget(mUI.getMonoDummySurface()); + return; } else { - return mFrameProcessor.getInputSurface(); + List<Surface> surfaces = mFrameProcessor.getInputSurfaces(); + for(Surface surface : surfaces) { + if(surfaceList != null) { + surfaceList.add(surface); + } + builder.addTarget(surface); + } + return; } } private Surface getPreviewSurfaceForSession(int id) { if (isBackCamera()) { if (getCameraMode() == DUAL_MODE && id == MONO_ID) { - return mUI.getSurfaceHolder2().getSurface(); + return mUI.getMonoDummySurface(); } else { return mUI.getSurfaceHolder().getSurface(); } @@ -2820,6 +2849,23 @@ public class CaptureModule implements CameraModule, PhotoController, mDisplayOrientation = CameraUtil.getDisplayOrientation(mDisplayRotation, getMainCameraId()); } + private void checkVideoSizeDependency() { + String makeup = mSettingsManager.getValue(SettingsManager.KEY_MAKEUP); + if(makeup.equalsIgnoreCase("on")) { + if(mVideoSize.getWidth() > 640 || mVideoSize.getHeight() > 480) { + mActivity.runOnUiThread(new Runnable() { + public void run() { + RotateTextToast.makeText(mActivity, R.string.makeup_video_size_limit, Toast.LENGTH_SHORT).show(); + } + }); + mSettingsManager.setValue(mSettingsManager.KEY_VIDEO_QUALITY, "640x480"); + } + mSettingsManager.updateVideoQualityMenu(getMainCameraId(), 640, 480); + } else { + mSettingsManager.updateVideoQualityMenu(getMainCameraId(), -1, -1); + } + } + @Override public void onSettingsChanged(List<SettingsManager.SettingState> settings) { if (mPaused) return; @@ -2873,7 +2919,11 @@ public class CaptureModule implements CameraModule, PhotoController, if (count == 0) restart(); return; case SettingsManager.KEY_MAKEUP: - restart(); + if (count == 0) restart(); + checkVideoSizeDependency(); + return; + case SettingsManager.KEY_TRACKINGFOCUS: + if (count == 0) restart(); return; case SettingsManager.KEY_SCENE_MODE: if (count == 0 && checkNeedToRestart(value)) { @@ -2947,8 +2997,9 @@ public class CaptureModule implements CameraModule, PhotoController, private boolean checkNeedToRestart(String value) { mPostProcessor.setFilter(PostProcessor.FILTER_NONE); int mode = Integer.parseInt(value); - if (getPostProcFilterId(mode) != PostProcessor.FILTER_NONE) + if (getPostProcFilterId(mode) != PostProcessor.FILTER_NONE) { return true; + } if (value.equals(SettingsManager.SCENE_MODE_DUAL_STRING) && mCurrentMode != DUAL_MODE) return true; if (!value.equals(SettingsManager.SCENE_MODE_DUAL_STRING) && mCurrentMode == DUAL_MODE) @@ -2996,7 +3047,7 @@ public class CaptureModule implements CameraModule, PhotoController, private Size getMaxSizeWithRatio(Size[] sizes, Size reference) { float ratio = (float) reference.getWidth() / reference.getHeight(); - for (Size size: sizes) { + for (Size size : sizes) { float prevRatio = (float) size.getWidth() / size.getHeight(); if (Math.abs(prevRatio - ratio) < 0.01) { return size; @@ -3005,6 +3056,10 @@ public class CaptureModule implements CameraModule, PhotoController, return sizes[0]; } + public TrackingFocusRenderer getTrackingForcusRenderer() { + return mUI.getTrackingFocusRenderer(); + } + /** * Compares two {@code Size}s based on their areas. */ |