summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/com/android/camera/CameraActivity.java8
-rwxr-xr-xsrc/com/android/camera/CaptureModule.java298
-rwxr-xr-xsrc/com/android/camera/CaptureUI.java7
-rwxr-xr-xsrc/com/android/camera/SettingsManager.java24
-rwxr-xr-xsrc/com/android/camera/imageprocessor/PostProcessor.java9
-rwxr-xr-xsrc/com/android/camera/ui/Camera2FaceView.java10
-rwxr-xr-xsrc/com/android/camera/util/CameraUtil.java10
7 files changed, 278 insertions, 88 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index f776d8ddd..4f02a697f 100755
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -1844,14 +1844,6 @@ public class CameraActivity extends Activity
}
mLocalImagesObserver.setActivityPaused(false);
mLocalVideosObserver.setActivityPaused(false);
-
- //This is a temporal solution to share LED resource
- //as Android doesn’t have any default intent to share the state.
- // if the led flash light is open, turn it off
- Log.d(TAG, "send the turn off Flashlight broadcast");
- Intent intent = new Intent("org.codeaurora.snapcam.action.CLOSE_FLASHLIGHT");
- intent.putExtra("camera_led", true);
- sendBroadcast(intent);
}
private boolean cameraConnected() {
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java
index 5ec6f5be9..300b8f06f 100755
--- a/src/com/android/camera/CaptureModule.java
+++ b/src/com/android/camera/CaptureModule.java
@@ -250,6 +250,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private static final int STREAM_CONFIG_MODE_QTIEIS_LOOKAHEAD = 0xF008;
private static final int STREAM_CONFIG_MODE_FOVC = 0xF010;
private static final int STREAM_CONFIG_MODE_ZZHDR = 0xF002;
+ private static final int STREAM_CONFIG_MODE_FS2 = 0xF040;
public static final boolean DEBUG =
(PersistUtil.getCamera2Debug() == PersistUtil.CAMERA2_DEBUG_DUMP_LOG) ||
@@ -393,6 +394,11 @@ public class CaptureModule implements CameraModule, PhotoController,
private static final CaptureRequest.Key<Byte> custom_noise_reduction =
new CaptureRequest.Key<>("org.quic.camera.CustomNoiseReduction.CustomNoiseReduction", byte.class);
+ public static final CaptureRequest.Key<Byte> sensor_mode_fs =
+ new CaptureRequest.Key<>("org.quic.camera.SensorModeFS ", byte.class);
+ public static CameraCharacteristics.Key<Byte> fs_mode_support =
+ new CameraCharacteristics.Key<>("org.quic.camera.SensorModeFS.isFastShutterModeSupported", Byte.class);
+
private boolean mIsDepthFocus = false;
private boolean[] mTakingPicture = new boolean[MAX_NUM_CAM];
private int mControlAFMode = CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
@@ -437,6 +443,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private SettingsManager mSettingsManager;
private long SECONDARY_SERVER_MEM;
private boolean mLongshotActive = false;
+ private long mLastLongshotTimestamp = 0;
private CameraCharacteristics mMainCameraCharacteristics;
private int mDisplayRotation;
private int mDisplayOrientation;
@@ -462,6 +469,15 @@ public class CaptureModule implements CameraModule, PhotoController,
private byte[] mJpegImageData;
private boolean mSaveRaw = false;
private boolean mSupportZoomCapture = true;
+ private long mStartRecordingTime;
+ private long mStopRecordingTime;
+
+ private int mLastAeState = -1;
+ private int mLastAfState = -1;
+ private boolean mIsCanceled = false;
+ private boolean mIsAutoFocusStarted = false;
+ private boolean mIsAutoFlash = false;
+ private int mSetAePrecaptureTriggerIdel = 0;
/**
* A {@link CameraCaptureSession } for camera preview.
@@ -994,13 +1010,13 @@ public class CaptureModule implements CameraModule, PhotoController,
};
private void updateCaptureStateMachine(int id, CaptureResult result) {
+ Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
+ Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
switch (mState[id]) {
case STATE_PREVIEW: {
break;
}
case STATE_WAITING_AF_LOCK: {
- Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
- Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
Log.d(TAG, "STATE_WAITING_AF_LOCK id: " + id + " afState:" + afState + " aeState:" + aeState);
// AF_PASSIVE is added for continous auto focus mode
@@ -1037,8 +1053,6 @@ public class CaptureModule implements CameraModule, PhotoController,
}
case STATE_WAITING_PRECAPTURE: {
// CONTROL_AE_STATE can be null on some devices
- Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
- Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
Log.d(TAG, "STATE_WAITING_PRECAPTURE id: " + id + " afState: " + afState + " aeState:" + aeState);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
@@ -1064,8 +1078,6 @@ public class CaptureModule implements CameraModule, PhotoController,
}
case STATE_WAITING_AE_LOCK: {
// CONTROL_AE_STATE can be null on some devices
- Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
- Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
Log.d(TAG, "STATE_WAITING_AE_LOCK id: " + id + " afState: " + afState + " aeState:" + aeState);
if (aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_LOCKED) {
checkAfAeStatesAndCapture(id);
@@ -1073,15 +1085,44 @@ public class CaptureModule implements CameraModule, PhotoController,
break;
}
case STATE_AF_AE_LOCKED: {
- Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
- Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
Log.d(TAG, "STATE_AF_AE_LOCKED id: " + id + " afState:" + afState + " aeState:" + aeState);
break;
}
case STATE_WAITING_TOUCH_FOCUS: {
- Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
- Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
Log.d(TAG, "STATE_WAITING_TOUCH_FOCUS id: " + id + " afState:" + afState + " aeState:" + aeState);
+ try {
+ if (mIsAutoFocusStarted) {
+ if (mIsCanceled && mSetAePrecaptureTriggerIdel == 1) {
+ Log.i(TAG, "STATE_WAITING_TOUCH_FOCUS SET CONTROL_AE_PRECAPTURE_TRIGGER_IDLE");
+ mPreviewRequestBuilder[id].set(
+ CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+ CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+ mCaptureSession[id].setRepeatingRequest(
+ mPreviewRequestBuilder[id].build(), mCaptureCallback,
+ mCameraHandler);
+ mSetAePrecaptureTriggerIdel = 0;
+ }
+ if (mPreviewRequestBuilder[id] != null && mLastAeState != -1
+ && (mLastAeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE
+ && (aeState == CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED
+ || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED))
+ && mIsAutoFlash
+ && !mIsCanceled) {
+
+ Log.i(TAG, "SET CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL START");
+ mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
+ CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
+ mCaptureSession[id].setRepeatingRequest(mPreviewRequestBuilder[id].build(),
+ mCaptureCallback, mCameraHandler);
+ mSetAePrecaptureTriggerIdel++;
+ mIsCanceled = true;
+ Log.i(TAG, "SET CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL END");
+
+ }
+ }
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
break;
}
case STATE_WAITING_AF_LOCKING: {
@@ -1089,18 +1130,14 @@ public class CaptureModule implements CameraModule, PhotoController,
break;
}
case STATE_WAITING_AF_AE_LOCK: {
- Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
- Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
Log.d(TAG, "STATE_WAITING_AF_AE_LOCK id: " + id + " afState: " + afState +
" aeState:" + aeState);
-
if ((aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED)) {
if (isFlashOn(id)) {
// if flash is on and AE state is CONVERGED then lock AE
lockExposure(id);
}
}
-
if ((CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) &&
(aeState == null || aeState == CaptureResult.CONTROL_AE_STATE_LOCKED)) {
@@ -1109,6 +1146,7 @@ public class CaptureModule implements CameraModule, PhotoController,
break;
}
}
+ mLastAeState = aeState;
}
private void checkAfAeStatesAndCapture(int id) {
@@ -1608,12 +1646,17 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
} else {
- if (mSettingsManager.getSavePictureFormat() == SettingsManager.HEIF_FORMAT &&
- outputConfigurations != null) {
- mCameraDevice[id].createCaptureSessionByOutputConfigurations(outputConfigurations,
- captureSessionCallback, null);
+ if (ApiHelper.isAndroidPOrHigher()) {
+ createCameraSessionWithSessionConfiguration(id, list, captureSessionCallback,
+ mCameraHandler, mPreviewRequestBuilder[id].build());
} else {
- mCameraDevice[id].createCaptureSession(list, captureSessionCallback, null);
+ if (mSettingsManager.getSavePictureFormat() == SettingsManager.HEIF_FORMAT &&
+ outputConfigurations != null) {
+ mCameraDevice[id].createCaptureSessionByOutputConfigurations(outputConfigurations,
+ captureSessionCallback, null);
+ } else {
+ mCameraDevice[id].createCaptureSession(list, captureSessionCallback, null);
+ }
}
}
} else {
@@ -1849,10 +1892,11 @@ public class CaptureModule implements CameraModule, PhotoController,
private void takePicture() {
Log.d(TAG, "takePicture");
mUI.enableShutter(false);
- if (mSettingsManager.isZSLInHALEnabled()&&
- !isFlashOn(getMainCameraId())&&
+ if ((mSettingsManager.isZSLInHALEnabled() &&
+ !isFlashOn(getMainCameraId()) &&
mPreviewCaptureResult.get(CaptureResult.CONTROL_AE_STATE) !=
- CameraMetadata.CONTROL_AE_STATE_FLASH_REQUIRED) {
+ CameraMetadata.CONTROL_AE_STATE_FLASH_REQUIRED) ||
+ isActionImageCapture()) {
takeZSLPictureInHAL();
} else {
if (isBackCamera()) {
@@ -1895,6 +1939,10 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
+ private boolean isActionImageCapture() {
+ return mIntentMode == INTENT_MODE_CAPTURE;
+ }
+
private boolean takeZSLPicture(int cameraId) {
if(mPostProcessor.isZSLEnabled() && mPostProcessor.takeZSLPicture()) {
checkAndPlayShutterSound(getMainCameraId());
@@ -1936,7 +1984,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private void parallelLockFocusExposure(int id) {
if (mActivity == null || mCameraDevice[id] == null
|| !checkSessionAndBuilder(mCaptureSession[id], mPreviewRequestBuilder[id])) {
- mUI.enableShutter(true);
+ enableShutterAndVideoOnUiThread(id);
warningToast("Camera is not ready yet to take a picture.");
return;
}
@@ -2011,7 +2059,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private void lockFocus(int id) {
if (mActivity == null || mCameraDevice[id] == null
|| !checkSessionAndBuilder(mCaptureSession[id], mPreviewRequestBuilder[id])) {
- mUI.enableShutter(true);
+ enableShutterAndVideoOnUiThread(id);
warningToast("Camera is not ready yet to take a picture.");
return;
}
@@ -2086,6 +2134,8 @@ public class CaptureModule implements CameraModule, PhotoController,
addPreviewSurface(builder, null, id);
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_AUTO;
+ mIsAutoFocusStarted = true;
+ mIsCanceled = false;
applySettingsForAutoFocus(builder, id);
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
mState[id] = STATE_WAITING_TOUCH_FOCUS;
@@ -2134,7 +2184,7 @@ public class CaptureModule implements CameraModule, PhotoController,
try {
if (null == mActivity || null == mCameraDevice[id]
|| !checkSessionAndBuilder(mCaptureSession[id], mPreviewRequestBuilder[id])) {
- mUI.enableShutter(true);
+ enableShutterAndVideoOnUiThread(id);
mLongshotActive = false;
warningToast("Camera is not ready yet to take a picture.");
return;
@@ -2143,7 +2193,7 @@ public class CaptureModule implements CameraModule, PhotoController,
CaptureRequest.Builder captureBuilder =
mCameraDevice[id].createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
- if(mSettingsManager.isZSLInHALEnabled()) {
+ if(mSettingsManager.isZSLInHALEnabled() || isActionImageCapture() ) {
captureBuilder.set(CaptureRequest.CONTROL_ENABLE_ZSL, true);
}else{
captureBuilder.set(CaptureRequest.CONTROL_ENABLE_ZSL, false);
@@ -2158,7 +2208,12 @@ public class CaptureModule implements CameraModule, PhotoController,
applyCaptureMFNR(captureBuilder);
}
applyCaptureBurstFps(captureBuilder);
- if (!(mIsSupportedQcfa || isDeepZoom())) {
+ String valueFS2 = mSettingsManager.getValue(SettingsManager.KEY_SENSOR_MODE_FS2_VALUE);
+ int fs2Value = 0;
+ if (valueFS2 != null) {
+ fs2Value = Integer.parseInt(valueFS2);
+ }
+ if (!(mIsSupportedQcfa || isDeepZoom() || (fs2Value ==1))) {
addPreviewSurface(captureBuilder, null, id);
}
if (mUI.getCurrentProMode() == ProMode.MANUAL_MODE) {
@@ -2172,8 +2227,11 @@ public class CaptureModule implements CameraModule, PhotoController,
} else if(id == getMainCameraId() && mPostProcessor.isFilterOn()) { // Case of post filtering
captureStillPictureForFilter(captureBuilder, id);
} else {
- captureBuilder.addTarget(mImageReader[id].getSurface());
- if (mSaveRaw) {
+ if (mImageReader[id] != null) {
+ captureBuilder.addTarget(mImageReader[id].getSurface());
+ }
+
+ if (mSaveRaw && mRawImageReader[id] != null) {
captureBuilder.addTarget(mRawImageReader[id].getSurface());
}
@@ -2294,6 +2352,9 @@ public class CaptureModule implements CameraModule, PhotoController,
long timestamp, long frameNumber) {
mLongshoting = true;
mNumFramesArrived.incrementAndGet();
+ if(mNumFramesArrived.get() == mShotNum) {
+ mLastLongshotTimestamp = timestamp;
+ }
Log.d(TAG, "captureStillPictureForLongshot onCaptureStarted: " + mNumFramesArrived.get());
if (mNumFramesArrived.get() >= mShotNum) {
mLongshotActive = false;
@@ -2639,17 +2700,19 @@ public class CaptureModule implements CameraModule, PhotoController,
ImageAvailableListener listener = new ImageAvailableListener(i) {
@Override
public void onImageAvailable(ImageReader reader) {
- if (mIsSupportedQcfa || isMFNREnabled()) {
+ if (captureWaitImageReceive()) {
mHandler.post(new Runnable() {
@Override
public void run() {
+ Log.d(TAG, "image available for cam enable shutter button " );
mUI.enableShutter(true);
}
});
}
Log.d(TAG, "image available for cam: " + mCamId);
Image image = reader.acquireNextImage();
- if (mLongshoting && (!mLongshotActive)) {
+ if (mLongshoting && (!mLongshotActive) &&
+ image.getTimestamp() > mLastLongshotTimestamp) {
image.close();
return;
}
@@ -2768,7 +2831,7 @@ public class CaptureModule implements CameraModule, PhotoController,
int orientation = Exif.getOrientation(exif);
mActivity.getMediaSaveService().addImage(bytes, title, date,
- null, image.getWidth(), image.getHeight(), orientation, null,
+ null, image.getWidth(), image.getHeight(), orientation, exif,
mOnMediaSavedListener, mContentResolver, "jpeg");
mActivity.updateThumbnail(bytes);
@@ -2806,6 +2869,7 @@ public class CaptureModule implements CameraModule, PhotoController,
});
}
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+ mIsAutoFocusStarted = false;
applyFlash(mPreviewRequestBuilder[id], id);
applySettingsForUnlockExposure(mPreviewRequestBuilder[id], id);
if (mSettingsManager.isDeveloperEnabled()) {
@@ -2826,7 +2890,7 @@ public class CaptureModule implements CameraModule, PhotoController,
@Override
public void run() {
mUI.stopSelfieFlash();
- if (!(mIsSupportedQcfa || isMFNREnabled())) {
+ if (!captureWaitImageReceive()) {
mUI.enableShutter(true);
}
if (mDeepPortraitMode) {
@@ -2850,6 +2914,22 @@ public class CaptureModule implements CameraModule, PhotoController,
return mfnrEnable;
}
+ private boolean isHDREnable() {
+ boolean hdrEnable = false;
+ if (mSettingsManager != null) {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_SCENE_MODE);
+ if (value != null) {
+ int mode = Integer.parseInt(value);
+ hdrEnable = (mode == CaptureRequest.CONTROL_SCENE_MODE_HDR);
+ }
+ }
+ return hdrEnable;
+ }
+
+ private boolean captureWaitImageReceive() {
+ return mIsSupportedQcfa || isMFNREnabled() || isHDREnable();
+ }
+
private Size parsePictureSize(String value) {
int indexX = value.indexOf('x');
int width = Integer.parseInt(value.substring(0, indexX));
@@ -2990,6 +3070,7 @@ public class CaptureModule implements CameraModule, PhotoController,
applyJpegQuality(builder);
applyFlash(builder, id);
applyCommonSettings(builder, id);
+ applySensorModeFS2(builder);
}
private void applySettingsForPrecapture(CaptureRequest.Builder builder, int id) {
@@ -3403,6 +3484,10 @@ public class CaptureModule implements CameraModule, PhotoController,
} else {
mChosenImageFormat = ImageFormat.JPEG;
}
+ // if intent action is ACTION_IMAGE_CAPTURE, use HAL-ZSL to capture
+ if (isActionImageCapture()) {
+ mChosenImageFormat = ImageFormat.JPEG;
+ }
setUpCameraOutputs(mChosenImageFormat);
}
@@ -4140,16 +4225,10 @@ public class CaptureModule implements CameraModule, PhotoController,
private void updateVideoSnapshotSize() {
mVideoSnapshotSize = mVideoSize;
- if (isVideoSize1080P(mVideoSnapshotSize)) {
- updateHFRSetting();
- mHighSpeedFPSRange = new Range(mHighSpeedCaptureRate, mHighSpeedCaptureRate);
- Log.d(TAG,"updateVideoSnapshotSize " + mHighSpeedCaptureRate);
- boolean is60FPS = ((int)mHighSpeedFPSRange.getUpper() == 60);
- // if video is 1080p encode except 60fps, VideoSnapShotSize set 16M(5312x2988)
- if (!is60FPS) {
- mVideoSnapshotSize = new Size(5312, 2988);
- }
+ if (!is4kSize(mVideoSize) && (mHighSpeedCaptureRate == 0)) {
+ mVideoSnapshotSize = getMaxPictureSizeLiveshot();
}
+
String videoSnapshot = getVideoSnapshotSize();
String[] sourceStrArray = videoSnapshot.split("x");
if (sourceStrArray != null && sourceStrArray.length >= 2) {
@@ -4163,6 +4242,35 @@ public class CaptureModule implements CameraModule, PhotoController,
mVideoSnapshotThumbSize = getOptimalPreviewSize(mVideoSnapshotSize, thumbSizes); // get largest thumb size
}
+ private boolean is4kSize(Size size) {
+ return (size.getHeight() >= 2160 || size.getWidth() >= 3840);
+ }
+
+ private Size getMaxPictureSizeLiveshot() {
+ Size[] sizes = mSettingsManager.getSupportedOutputSize(getMainCameraId(), ImageFormat.JPEG);
+ float ratio = (float) mVideoSize.getWidth() / mVideoSize.getHeight();
+ Size optimalSize = null;
+ for (Size size : sizes) {
+ float pictureRatio = (float) size.getWidth() / size.getHeight();
+ if (Math.abs(pictureRatio - ratio) > 0.01) continue;
+ if (optimalSize == null || size.getWidth() > optimalSize.getWidth()) {
+ optimalSize = size;
+ }
+ }
+
+ // Cannot find one that matches the aspect ratio. This should not happen.
+ // Ignore the requirement.
+ if (optimalSize == null) {
+ Log.w(TAG, "getMaxPictureSizeLiveshot: no picture size match the aspect ratio");
+ for (Size size : sizes) {
+ if (optimalSize == null || size.getWidth() > optimalSize.getWidth()) {
+ optimalSize = size;
+ }
+ }
+ }
+ return optimalSize;
+ }
+
private String getVideoSnapshotSize(){
return SystemProperties.get("persist.sys.camera.video.snapshotsize", "");
}
@@ -4235,8 +4343,9 @@ public class CaptureModule implements CameraModule, PhotoController,
mCaptureSession[cameraId] = cameraCaptureSession;
try {
setUpVideoCaptureRequestBuilder(mVideoRequestBuilder, cameraId);
- mCurrentSession.setRepeatingRequest(mVideoRequestBuilder.build(),
- mCaptureCallback, mCameraHandler);
+ List list = CameraUtil
+ .createHighSpeedRequestList(mVideoRequestBuilder.build());
+ mCurrentSession.setRepeatingBurst(list, mCaptureCallback, mCameraHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
@@ -4277,25 +4386,24 @@ public class CaptureModule implements CameraModule, PhotoController,
List<CaptureRequest> slowMoRequests = null;
try {
setUpVideoCaptureRequestBuilder(mVideoRequestBuilder, cameraId);
- if (mHighSpeedCapture && ((int) mHighSpeedFPSRange.getUpper() > NORMAL_SESSION_MAX_FPS)) {
- slowMoRequests = ((CameraConstrainedHighSpeedCaptureSession) mCurrentSession).
- createHighSpeedRequestList(mVideoRequestBuilder.build());
- mCurrentSession.setRepeatingBurst(slowMoRequests,
- mCaptureCallback, mCameraHandler);
- } else {
- mCurrentSession.setRepeatingRequest(mVideoRequestBuilder.build(),
- mCaptureCallback, mCameraHandler);
- }
+ List list = CameraUtil
+ .createHighSpeedRequestList(mVideoRequestBuilder.build());
+ mCurrentSession.setRepeatingBurst(list,mCaptureCallback, mCameraHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
if ((!mFrameProcessor.isFrameListnerEnabled() && !startMediaRecorder()) || !mIsRecordingVideo) {
- mUI.showUIafterRecording();
releaseMediaRecorder();
- mFrameProcessor.setVideoOutputSurface(null);
- restartSession(true);
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mUI.showUIafterRecording();
+ mFrameProcessor.setVideoOutputSurface(null);
+ restartSession(true);
+ }
+ });
return;
}
@@ -4324,6 +4432,45 @@ public class CaptureModule implements CameraModule, PhotoController,
}
};
+
+ private void createCameraSessionWithSessionConfiguration(int cameraId,
+ List<Surface> outputSurfaces, CameraCaptureSession.StateCallback listener,
+ Handler handler, CaptureRequest initialRequest) {
+ List<OutputConfiguration> outConfigurations = new ArrayList<>(outputSurfaces.size());
+ for (Surface surface : outputSurfaces) {
+ outConfigurations.add(new OutputConfiguration(surface));
+ }
+ int opMode = SESSION_REGULAR;
+ String valueFS2 = mSettingsManager.getValue(SettingsManager.KEY_SENSOR_MODE_FS2_VALUE);
+ if (valueFS2 != null) {
+ int intValue = Integer.parseInt(valueFS2);
+ if (intValue == 1) {
+ opMode |= STREAM_CONFIG_MODE_FS2;
+ }
+ }
+ Log.v(TAG, " createCameraSessionWithSessionConfiguration opMode: " + opMode);
+ Method method_setSessionParameters = null;
+ Method method_createCaptureSession = null;
+ Object sessionConfig = null;
+ try {
+ Class clazz = Class.forName("android.hardware.camera2.params.SessionConfiguration");
+ sessionConfig = clazz.getConstructors()[0].newInstance(
+ opMode, outConfigurations,
+ new HandlerExecutor(handler), listener);
+ if (method_setSessionParameters == null) {
+ method_setSessionParameters = clazz.getDeclaredMethod(
+ "setSessionParameters", CaptureRequest.class);
+ }
+ method_setSessionParameters.invoke(sessionConfig, initialRequest);
+ method_createCaptureSession = CameraDevice.class.getDeclaredMethod(
+ "createCaptureSession", clazz);
+ method_createCaptureSession.invoke(mCameraDevice[cameraId], sessionConfig);
+ } catch (Exception exception) {
+ Log.w(TAG, "createCameraSessionWithSessionConfiguration method is not exist");
+ exception.printStackTrace();
+ }
+ }
+
private void configureCameraSessionWithParameters(int cameraId,
List<Surface> outputSurfaces, CameraCaptureSession.StateCallback listener,
Handler handler, CaptureRequest initialRequest) throws CameraAccessException {
@@ -4434,6 +4581,7 @@ public class CaptureModule implements CameraModule, PhotoController,
if (null == mCameraDevice[cameraId]) {
return false;
}
+ mStartRecordingTime = System.currentTimeMillis();
Log.d(TAG, "StartRecordingVideo " + cameraId);
mStartRecPending = true;
mIsRecordingVideo = true;
@@ -4455,6 +4603,7 @@ public class CaptureModule implements CameraModule, PhotoController,
mCameraHandler.removeMessages(CANCEL_TOUCH_FOCUS, mCameraId[cameraId]);
mState[cameraId] = STATE_PREVIEW;
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+ mIsAutoFocusStarted = false;
closePreviewSession();
mFrameProcessor.onClose();
@@ -4521,6 +4670,7 @@ public class CaptureModule implements CameraModule, PhotoController,
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
mCurrentSession = cameraCaptureSession;
+ Log.v(TAG, "createConstrainedHighSpeedCaptureSession onConfigured");
mCaptureSession[cameraId] = cameraCaptureSession;
CameraConstrainedHighSpeedCaptureSession session =
(CameraConstrainedHighSpeedCaptureSession) mCurrentSession;
@@ -4642,7 +4792,8 @@ public class CaptureModule implements CameraModule, PhotoController,
requestAudioFocus();
try {
mMediaRecorder.start(); // Recording is now started
- Log.d(TAG, "StartRecordingVideo done.");
+ Log.d(TAG, "StartRecordingVideo done. Time=" +
+ (System.currentTimeMillis() - mStartRecordingTime) + "ms");
} catch (RuntimeException e) {
Toast.makeText(mActivity,"Could not start media recorder.\n " +
"Can't start video recording.", Toast.LENGTH_LONG).show();
@@ -4761,7 +4912,7 @@ public class CaptureModule implements CameraModule, PhotoController,
try {
builder.set(custom_noise_reduction, (byte)0x01);
} catch (IllegalArgumentException e) {
- Log.w(TAG, "cannot find vendor tag: " + custom_noise_reduction.toString());
+ Log.w(TAG, "capture can`t find vendor tag: " + custom_noise_reduction.toString());
}
}
}
@@ -5032,7 +5183,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private void stopRecordingVideo(int cameraId) {
Log.d(TAG, "stopRecordingVideo " + cameraId);
-
+ mStopRecordingTime = System.currentTimeMillis();
mStopRecPending = true;
boolean shouldAddToMediaStoreNow = false;
// Stop recording
@@ -5050,7 +5201,8 @@ public class CaptureModule implements CameraModule, PhotoController,
mMediaRecorder.setOnInfoListener(null);
mMediaRecorder.stop();
shouldAddToMediaStoreNow = true;
- Log.d(TAG, "stopRecordingVideo done.");
+ Log.d(TAG, "stopRecordingVideo done. Time=" +
+ (System.currentTimeMillis() - mStopRecordingTime) + "ms");
AccessibilityUtils.makeAnnouncement(mUI.getVideoButton(),
mActivity.getString(R.string.video_recording_stopped));
} catch (RuntimeException e) {
@@ -5696,6 +5848,20 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
+ private void applySensorModeFS2(CaptureRequest.Builder request) {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_SENSOR_MODE_FS2_VALUE);
+ if (value != null) {
+ int intValue = Integer.parseInt(value);
+ byte fs2 =(byte)((intValue == 0) ? 0x00 : 0x01);
+ Log.v(TAG, "applySensorModeFS2 intValue : " + intValue + ", fs2 :" + fs2);
+ try {
+ request.set(CaptureModule.sensor_mode_fs, fs2);
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, "hal no vendorTag : " + sensor_mode_fs);
+ }
+ }
+ }
+
private void applyExposureMeteringModes(CaptureRequest.Builder request) {
String value = mSettingsManager.getValue(SettingsManager.KEY_EXPOSURE_METERING_MODE);
if (value != null) {
@@ -5983,6 +6149,13 @@ public class CaptureModule implements CameraModule, PhotoController,
&& mode != SettingsManager.SCENE_MODE_PROMODE_INT) {
request.set(CaptureRequest.CONTROL_SCENE_MODE, mode);
request.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
+ if (mode == CaptureRequest.CONTROL_SCENE_MODE_HDR) {
+ try {
+ request.set(custom_noise_reduction, (byte)0x01);
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, " HDR can`t find vendor tag: " + custom_noise_reduction.toString());
+ }
+ }
} else {
request.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
}
@@ -6213,6 +6386,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private void applyFlash(CaptureRequest.Builder request, String value) {
if(DEBUG) Log.d(TAG, "applyFlash: " + value);
String redeye = mSettingsManager.getValue(SettingsManager.KEY_REDEYE_REDUCTION);
+ mIsAutoFlash = false;
if (redeye != null && redeye.equals("on") && !mLongshotActive) {
request.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);
@@ -6229,6 +6403,7 @@ public class CaptureModule implements CameraModule, PhotoController,
}
break;
case "auto":
+ mIsAutoFlash = true;
if (isCaptureBrust) {
// When long shot is active, turn off the flash in auto mode
request.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
@@ -6263,6 +6438,7 @@ public class CaptureModule implements CameraModule, PhotoController,
String value = mSettingsManager.getValue(SettingsManager.KEY_FLASH_MODE);
boolean isCaptureBrust = isCaptureBrustMode();
+ mIsAutoFlash = false;
switch (value) {
case "on":
if (isCaptureBrust) {
@@ -6274,6 +6450,7 @@ public class CaptureModule implements CameraModule, PhotoController,
}
break;
case "auto":
+ mIsAutoFlash = true;
if (isCaptureBrust) {
// When long shot is active, turn off the flash in auto mode
request.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
@@ -6412,6 +6589,7 @@ public class CaptureModule implements CameraModule, PhotoController,
mInTAF = false;
mState[id] = STATE_PREVIEW;
mControlAFMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+ mIsAutoFocusStarted = false;
setAFModeToPreview(id, mControlAFMode);
}
diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java
index 8b72d9259..85ac9e293 100755
--- a/src/com/android/camera/CaptureUI.java
+++ b/src/com/android/camera/CaptureUI.java
@@ -1296,7 +1296,12 @@ public class CaptureUI implements FocusOverlayManager.FocusUI,
public void hideCameraControls(boolean hide) {
final int status = (hide) ? View.INVISIBLE : View.VISIBLE;
- if (mFlashButton != null) mFlashButton.setVisibility(status);
+ if (mFlashButton != null){
+ mFlashButton.setVisibility(status);
+ if (!hide) {
+ mFlashButton.init(false);
+ }
+ }
if (mFrontBackSwitcher != null) mFrontBackSwitcher.setVisibility(status);
if (mSceneModeSwitcher != null) mSceneModeSwitcher.setVisibility(status);
if (mFilterModeSwitcher != null) mFilterModeSwitcher.setVisibility(status);
diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java
index edf176ce9..0a8e00ecc 100755
--- a/src/com/android/camera/SettingsManager.java
+++ b/src/com/android/camera/SettingsManager.java
@@ -161,6 +161,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
public static final String KEY_HDR = "pref_camera2_hdr_key";
public static final String KEY_VIDEO_HDR_VALUE = "pref_camera2_video_hdr_key";
public static final String KEY_CAPTURE_MFNR_VALUE = "pref_camera2_capture_mfnr_key";
+ public static final String KEY_SENSOR_MODE_FS2_VALUE = "pref_camera2_fs2_key";
public static final String KEY_SAVERAW = "pref_camera2_saveraw_key";
public static final String KEY_ZOOM = "pref_camera2_zoom_key";
public static final String KEY_SHARPNESS_CONTROL_MODE = "pref_camera2_sharpness_control_key";
@@ -749,6 +750,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
ListPreference zoom = mPreferenceGroup.findPreference(KEY_ZOOM);
ListPreference qcfa = mPreferenceGroup.findPreference(KEY_QCFA);
ListPreference bsgc = mPreferenceGroup.findPreference(KEY_BSGC_DETECTION);
+ ListPreference fsMode = mPreferenceGroup.findPreference(KEY_SENSOR_MODE_FS2_VALUE);
if (whiteBalance != null) {
if (filterUnsupportedOptions(whiteBalance, getSupportedWhiteBalanceModes(cameraId))) {
@@ -900,6 +902,11 @@ public class SettingsManager implements ListMenu.SettingsListener {
}
}
+ if (fsMode != null) {
+ if (!isFastShutterModeSupported(cameraId)) {
+ removePreference(mPreferenceGroup, KEY_SENSOR_MODE_FS2_VALUE);
+ }
+ }
}
@@ -1346,6 +1353,17 @@ public class SettingsManager implements ListMenu.SettingsListener {
return ret;
}
+ private boolean isFastShutterModeSupported(int id) {
+ boolean result = false;
+ try {
+ byte fastModeSupport = mCharacteristics.get(id).get(CaptureModule.fs_mode_support);
+ result = (fastModeSupport == 1);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
public boolean isFacingFront(int id) {
int facing = mCharacteristics.get(id).get(CameraCharacteristics.LENS_FACING);
return facing == CameraCharacteristics.LENS_FACING_FRONT;
@@ -1799,11 +1817,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
public boolean isZSLInAppEnabled(){
String value = getValue(KEY_ZSL);
String appZSLValue = mContext.getString(R.string.pref_camera2_zsl_entryvalue_app_zsl);
- if ( (value != null && value.equals(appZSLValue)) ||
- SettingsManager.SCENE_MODE_SUNSET_STRING.equals(
- SettingsManager.getInstance().getValue(SettingsManager.KEY_SCENE_MODE)) ||
- SettingsManager.SCENE_MODE_LANDSCAPE_STRING.equals(
- SettingsManager.getInstance().getValue(SettingsManager.KEY_SCENE_MODE))){
+ if ( value != null && value.equals(appZSLValue)){
return true;
}else{
return false;
diff --git a/src/com/android/camera/imageprocessor/PostProcessor.java b/src/com/android/camera/imageprocessor/PostProcessor.java
index 69e2ecd5c..6eabe9c76 100755
--- a/src/com/android/camera/imageprocessor/PostProcessor.java
+++ b/src/com/android/camera/imageprocessor/PostProcessor.java
@@ -1125,6 +1125,10 @@ public class PostProcessor{
if(result.get(CaptureResult.SENSOR_SENSITIVITY) != null) {
exif.addISO(result.get(CaptureResult.SENSOR_SENSITIVITY));
}
+ if(result.get(CaptureResult.JPEG_GPS_LOCATION ) != null) {
+ exif.addGpsTags(result.get(CaptureResult.JPEG_GPS_LOCATION).getLatitude(),
+ result.get(CaptureResult.JPEG_GPS_LOCATION).getLongitude());
+ }
}
ByteArrayOutputStream jpegOut = new ByteArrayOutputStream();
try {
@@ -1209,9 +1213,10 @@ public class PostProcessor{
mController.showCapturedReview(bytes, mOrientation);
}
}
+ ExifInterface exif = Exif.getExif(bytes);
mActivity.getMediaSaveService().addImage(
bytes, title, date, null, resultImage.outRoi.width(), resultImage.outRoi.height(),
- mOrientation, null, mediaSavedListener, contentResolver, "jpeg");
+ mOrientation, exif, mediaSavedListener, contentResolver, "jpeg");
mController.updateThumbnailJpegData(bytes);
}
}
@@ -1285,7 +1290,7 @@ public class PostProcessor{
} else {
mActivity.getMediaSaveService().addImage(
bytes, title, date, null, image.getCropRect().width(), image.getCropRect().height(),
- orientation, null, mController.getMediaSavedListener(), mActivity.getContentResolver(), "jpeg");
+ orientation, exif, mController.getMediaSavedListener(), mActivity.getContentResolver(), "jpeg");
mController.updateThumbnailJpegData(bytes);
image.close();
}
diff --git a/src/com/android/camera/ui/Camera2FaceView.java b/src/com/android/camera/ui/Camera2FaceView.java
index 53f7e2f09..f99351b30 100755
--- a/src/com/android/camera/ui/Camera2FaceView.java
+++ b/src/com/android/camera/ui/Camera2FaceView.java
@@ -164,9 +164,6 @@ public class Camera2FaceView extends FaceView {
mMatrix.postRotate(mOrientation); // postRotate is clockwise
canvas.rotate(-mOrientation); // rotate is counter-clockwise (for canvas)
- float rectWidth;
- float rectHeight;
- float diameter;
int extendFaceSize = 0;
extendFaceSize = mExFaces == null? 0 : mExFaces.length;
for (int i = 0; i < mFaces.length; i++) {
@@ -187,12 +184,7 @@ public class Camera2FaceView extends FaceView {
if (LOGV) CameraUtil.dumpRect(mRect, "Transformed rect");
mPaint.setColor(mColor);
mRect.offset(dx, dy);
-
- rectHeight = mRect.bottom-mRect.top;
- rectWidth = mRect.right - mRect.left;
- diameter = rectHeight > rectWidth ? rectWidth : rectHeight;
-
- canvas.drawCircle(mRect.centerX(), mRect.centerY(), diameter/2, mPaint);
+ canvas.drawRect(mRect, mPaint);
if (i < extendFaceSize && mExFaces[i] != null) {
ExtendedFace exFace = mExFaces[i];
diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java
index 854b5bdfa..6b5f941e0 100755
--- a/src/com/android/camera/util/CameraUtil.java
+++ b/src/com/android/camera/util/CameraUtil.java
@@ -1403,9 +1403,13 @@ public class CameraUtil {
Collection<Surface> outputSurfaces = request.getTargets();
Range<Integer> fpsRange = request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
- StreamConfigurationMap config =
- SettingsManager.getInstance().getStreamConfigurationMap((int)request.getTag());
- SurfaceUtils.checkConstrainedHighSpeedSurfaces(outputSurfaces, fpsRange, config);
+ try {
+ StreamConfigurationMap config =
+ SettingsManager.getInstance().getStreamConfigurationMap((int)request.getTag());
+ SurfaceUtils.checkConstrainedHighSpeedSurfaces(outputSurfaces, fpsRange, config);
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, " checkConstrainedHighSpeedSurfaces occur " + e.toString());
+ }
// Request list size: to limit the preview to 30fps, need use maxFps/30; to maximize
// the preview frame rate, should use maxBatch size for that high speed stream