diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/com/android/camera/CameraActivity.java | 8 | ||||
-rwxr-xr-x | src/com/android/camera/CaptureModule.java | 298 | ||||
-rwxr-xr-x | src/com/android/camera/CaptureUI.java | 7 | ||||
-rwxr-xr-x | src/com/android/camera/SettingsManager.java | 24 | ||||
-rwxr-xr-x | src/com/android/camera/imageprocessor/PostProcessor.java | 9 | ||||
-rwxr-xr-x | src/com/android/camera/ui/Camera2FaceView.java | 10 | ||||
-rwxr-xr-x | src/com/android/camera/util/CameraUtil.java | 10 |
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 |