summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/CaptureModule.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/CaptureModule.java')
-rw-r--r--src/com/android/camera/CaptureModule.java357
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.
*/