diff options
Diffstat (limited to 'src/com/android/camera/VideoModule.java')
-rw-r--r-- | src/com/android/camera/VideoModule.java | 235 |
1 files changed, 166 insertions, 69 deletions
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java index 6d4ddc4e6..72e5b32dd 100644 --- a/src/com/android/camera/VideoModule.java +++ b/src/com/android/camera/VideoModule.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2012 The Android Open Source Project - * Copyright (C) 2013 The CyanogenMod Project + * Copyright (C) 2013-2014 The CyanogenMod Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -242,7 +242,7 @@ public class VideoModule implements CameraModule, return; } mParameters = mCameraDevice.getParameters(); - mPreviewFocused = true; + mPreviewFocused = arePreviewControlsVisible(); initializeCapabilities(); } @@ -312,6 +312,7 @@ public class VideoModule implements CameraModule, boolean mUnsupportedResolution = false; private boolean mUnsupportedHFRVideoSize = false; private boolean mUnsupportedHFRVideoCodec = false; + private String mDefaultAntibanding = null; public void onScreenSizeChanged(int width, int height, int previewWidth, int previewHeight) { if (mFocusManager != null) mFocusManager.setPreviewSize(width, height); @@ -444,6 +445,9 @@ public class VideoModule implements CameraModule, // Power shutter mActivity.initPowerShutter(mPreferences); + // Max brightness + mActivity.initMaxBrightness(mPreferences); + /* * To reduce startup time, we start the preview in another thread. * We make sure the preview is started at the end of onCreate. @@ -603,8 +607,10 @@ public class VideoModule implements CameraModule, if (mOrientation != newOrientation) { mOrientation = newOrientation; Log.v(TAG, "onOrientationChanged, update parameters"); - if ((mParameters != null) && (true == mPreviewing) && !mMediaRecorderRecording){ - setCameraParameters(); + if ((mCameraDevice != null) && (mParameters != null) + && (true == mPreviewing) && !mMediaRecorderRecording){ + setFlipValue(); + mCameraDevice.setParameters(mParameters); } } @@ -757,26 +763,13 @@ public class VideoModule implements CameraModule, Log.v(TAG, "Audio Encoder selected = " +mAudioEncoder); - String minutesStr = mPreferences.getString( - CameraSettings.KEY_VIDEO_DURATION, - mActivity.getString(R.string.pref_camera_video_duration_default)); - int minutes = -1; - try { - minutes = Integer.parseInt(minutesStr); - } catch(NumberFormatException npe) { - // use default value continue - minutes = Integer.parseInt(mActivity.getString( - R.string.pref_camera_video_duration_default)); - } - if (minutes == -1) { - // User wants lowest, set 30s */ - mMaxVideoDurationInMs = 30000; - } else { - // 1 minute = 60000ms - mMaxVideoDurationInMs = 60000 * minutes; + // Set wavelet denoise mode + if (mParameters.getSupportedDenoiseModes() != null) { + String denoise = mPreferences.getString(CameraSettings.KEY_DENOISE, + mActivity.getString(R.string.pref_camera_denoise_default)); + mParameters.setDenoise(denoise); } - - } + } private final class AutoFocusCallback implements CameraAFCallback { @@ -1069,6 +1062,7 @@ public class VideoModule implements CameraModule, mCameraDevice.stopPreview(); mPreviewing = false; mStopPrevPending = false; + mUI.enableShutter(false); } private void closeCamera() { @@ -1186,6 +1180,7 @@ public class VideoModule implements CameraModule, switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: + case KeyEvent.KEYCODE_MEDIA_NEXT: if (event.getRepeatCount() == 0 && !CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) { mUI.clickShutter(); @@ -1194,6 +1189,7 @@ public class VideoModule implements CameraModule, } return true; case KeyEvent.KEYCODE_VOLUME_DOWN: + case KeyEvent.KEYCODE_MEDIA_PREVIOUS: if (event.getRepeatCount() == 0 && !CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) { mUI.clickShutter(); @@ -1202,6 +1198,7 @@ public class VideoModule implements CameraModule, } return true; case KeyEvent.KEYCODE_CAMERA: + case KeyEvent.KEYCODE_HEADSETHOOK: if (event.getRepeatCount() == 0) { mUI.clickShutter(); } @@ -1230,16 +1227,19 @@ public class VideoModule implements CameraModule, public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: + case KeyEvent.KEYCODE_MEDIA_NEXT: if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) { mUI.pressShutter(false); } return true; case KeyEvent.KEYCODE_VOLUME_DOWN: + case KeyEvent.KEYCODE_MEDIA_PREVIOUS: if (!CameraActivity.mPowerShutter && !CameraUtil.hasCameraKey()) { mUI.pressShutter(false); } return true; case KeyEvent.KEYCODE_CAMERA: + case KeyEvent.KEYCODE_HEADSETHOOK: mUI.pressShutter(false); return true; case KeyEvent.KEYCODE_POWER: @@ -1500,7 +1500,11 @@ public class VideoModule implements CameraModule, private void saveVideo() { if (mVideoFileDescriptor == null) { - long duration = SystemClock.uptimeMillis() - mRecordingStartTime + mRecordingTotalTime; + long duration = 0L; + if (mMediaRecorderPausing == false) + duration = SystemClock.uptimeMillis() - mRecordingStartTime + mRecordingTotalTime; + else + duration = mRecordingTotalTime; if (duration > 0) { if (mCaptureTimeLapse) { duration = getTimeLapseVideoLength(duration); @@ -1516,6 +1520,20 @@ public class VideoModule implements CameraModule, return; } + /* Change the duration as per HFR selection */ + String hfr = mParameters.getVideoHighFrameRate(); + int defaultFps = 30; + int hfrRatio = 1; + if (!("off".equals(hfr))) { + try { + int hfrFps = Integer.parseInt(hfr); + hfrRatio = hfrFps / defaultFps; + } catch(Exception ex) { + // Do nothing + } + } + duration = duration * hfrRatio; + mActivity.getMediaSaveService().addVideo(mCurrentVideoFilename, duration, mCurrentVideoValues, mOnVideoSavedListener, mContentResolver); @@ -1805,6 +1823,7 @@ public class VideoModule implements CameraModule, UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, fail ? UsageStatistics.ACTION_CAPTURE_FAIL : UsageStatistics.ACTION_CAPTURE_DONE, "Video", + mMediaRecorderPausing ? mRecordingTotalTime : SystemClock.uptimeMillis() - mRecordingStartTime + mRecordingTotalTime); mStopRecPending = false; return fail; @@ -1935,6 +1954,53 @@ public class VideoModule implements CameraModule, return supported == null ? false : supported.indexOf(value) >= 0; } + private void setFlipValue() { + + // Read Flip mode from adb command + //value: 0(default) - FLIP_MODE_OFF + //value: 1 - FLIP_MODE_H + //value: 2 - FLIP_MODE_V + //value: 3 - FLIP_MODE_VH + int preview_flip_value = SystemProperties.getInt("debug.camera.preview.flip", 0); + int video_flip_value = SystemProperties.getInt("debug.camera.video.flip", 0); + int picture_flip_value = SystemProperties.getInt("debug.camera.picture.flip", 0); + int rotation = CameraUtil.getJpegRotation(mCameraId, mOrientation); + mParameters.setRotation(rotation); + if (rotation == 90 || rotation == 270) { + // in case of 90 or 270 degree, V/H flip should reverse + if (preview_flip_value == 1) { + preview_flip_value = 2; + } else if (preview_flip_value == 2) { + preview_flip_value = 1; + } + if (video_flip_value == 1) { + video_flip_value = 2; + } else if (video_flip_value == 2) { + video_flip_value = 1; + } + if (picture_flip_value == 1) { + picture_flip_value = 2; + } else if (picture_flip_value == 2) { + picture_flip_value = 1; + } + } + String preview_flip = CameraUtil.getFilpModeString(preview_flip_value); + String video_flip = CameraUtil.getFilpModeString(video_flip_value); + String picture_flip = CameraUtil.getFilpModeString(picture_flip_value); + + if(CameraUtil.isSupported(preview_flip, CameraSettings.getSupportedFlipMode(mParameters))){ + mParameters.set(CameraSettings.KEY_QC_PREVIEW_FLIP, preview_flip); + } + if(CameraUtil.isSupported(video_flip, CameraSettings.getSupportedFlipMode(mParameters))){ + mParameters.set(CameraSettings.KEY_QC_VIDEO_FLIP, video_flip); + } + if(CameraUtil.isSupported(picture_flip, CameraSettings.getSupportedFlipMode(mParameters))){ + mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip); + } + + + } + private void qcomSetCameraParameters(){ // add QCOM Parameters here // Set color effect parameter. @@ -1955,6 +2021,23 @@ public class VideoModule implements CameraModule, mParameters.set(CameraSettings.KEY_QC_DIS_MODE, disMode); } + if (mDefaultAntibanding == null) { + mDefaultAntibanding = mParameters.getAntibanding(); + Log.d(TAG, "default antibanding value = " + mDefaultAntibanding); + } + + if (disMode.equals("enable")) { + Log.d(TAG, "dis is enabled, set antibanding to auto."); + if (isSupported(Parameters.ANTIBANDING_AUTO, mParameters.getSupportedAntibanding())) { + mParameters.setAntibanding(Parameters.ANTIBANDING_AUTO); + } + } else { + if (isSupported(mDefaultAntibanding, mParameters.getSupportedAntibanding())) { + mParameters.setAntibanding(mDefaultAntibanding); + } + } + Log.d(TAG, "antiBanding value = " + mParameters.getAntibanding()); + mUnsupportedHFRVideoSize = false; mUnsupportedHFRVideoCodec = false; // To set preview format as YV12 , run command @@ -1991,6 +2074,30 @@ public class VideoModule implements CameraModule, Log.e(TAG, "supported hfr sizes is null"); } + int hfrFps = Integer.parseInt(highFrameRate); + int inputBitrate = videoWidth*videoHeight*hfrFps; + + //check if codec supports the resolution, otherwise throw toast + List<VideoEncoderCap> videoEncoders = EncoderCapabilities.getVideoEncoders(); + for (VideoEncoderCap videoEncoder: videoEncoders) { + if (videoEncoder.mCodec == mVideoEncoder){ + int maxBitrate = (videoEncoder.mMaxHFRFrameWidth * + videoEncoder.mMaxHFRFrameHeight * + videoEncoder.mMaxHFRMode); + if (inputBitrate > maxBitrate ){ + Log.e(TAG,"Selected codec "+mVideoEncoder+ + " does not support HFR " + highFrameRate + " with "+ videoWidth + + "x" + videoHeight +" resolution"); + Log.e(TAG, "Codec capabilities: " + + "mMaxHFRFrameWidth = " + videoEncoder.mMaxHFRFrameWidth + " , "+ + "mMaxHFRFrameHeight = " + videoEncoder.mMaxHFRFrameHeight + " , "+ + "mMaxHFRMode = " + videoEncoder.mMaxHFRMode); + mUnsupportedHFRVideoSize = true; + } + break; + } + } + if(mUnsupportedHFRVideoSize) Log.v(TAG,"Unsupported hfr resolution"); @@ -2005,48 +2112,7 @@ public class VideoModule implements CameraModule, mParameters.setVideoHighFrameRate("off"); } - // Read Flip mode from adb command - //value: 0(default) - FLIP_MODE_OFF - //value: 1 - FLIP_MODE_H - //value: 2 - FLIP_MODE_V - //value: 3 - FLIP_MODE_VH - int preview_flip_value = SystemProperties.getInt("debug.camera.preview.flip", 0); - int video_flip_value = SystemProperties.getInt("debug.camera.video.flip", 0); - int picture_flip_value = SystemProperties.getInt("debug.camera.picture.flip", 0); - int rotation = CameraUtil.getJpegRotation(mCameraId, mOrientation); - mParameters.setRotation(rotation); - if (rotation == 90 || rotation == 270) { - // in case of 90 or 270 degree, V/H flip should reverse - if (preview_flip_value == 1) { - preview_flip_value = 2; - } else if (preview_flip_value == 2) { - preview_flip_value = 1; - } - if (video_flip_value == 1) { - video_flip_value = 2; - } else if (video_flip_value == 2) { - video_flip_value = 1; - } - if (picture_flip_value == 1) { - picture_flip_value = 2; - } else if (picture_flip_value == 2) { - picture_flip_value = 1; - } - } - String preview_flip = CameraUtil.getFilpModeString(preview_flip_value); - String video_flip = CameraUtil.getFilpModeString(video_flip_value); - String picture_flip = CameraUtil.getFilpModeString(picture_flip_value); - - if(CameraUtil.isSupported(preview_flip, CameraSettings.getSupportedFlipMode(mParameters))){ - mParameters.set(CameraSettings.KEY_QC_PREVIEW_FLIP, preview_flip); - } - if(CameraUtil.isSupported(video_flip, CameraSettings.getSupportedFlipMode(mParameters))){ - mParameters.set(CameraSettings.KEY_QC_VIDEO_FLIP, video_flip); - } - if(CameraUtil.isSupported(picture_flip, CameraSettings.getSupportedFlipMode(mParameters))){ - mParameters.set(CameraSettings.KEY_QC_SNAPSHOT_PICTURE_FLIP, picture_flip); - } - + setFlipValue(); // Set Video HDR. String videoHDR = mPreferences.getString( CameraSettings.KEY_VIDEO_HDR, @@ -2056,6 +2122,39 @@ public class VideoModule implements CameraModule, mParameters.setVideoHDRMode(videoHDR); } else mParameters.setVideoHDRMode("off"); + + //HFR recording not supported with DIS,TimeLapse,HDR option + String hfr = mParameters.getVideoHighFrameRate(); + String hdr = mParameters.getVideoHDRMode(); + if ((hfr != null) && (!hfr.equals("off"))) { + // Read time lapse recording interval. + String frameIntervalStr = mPreferences.getString( + CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL, + mActivity.getString(R.string.pref_video_time_lapse_frame_interval_default)); + int timeLapseInterval = Integer.parseInt(frameIntervalStr); + if ( (timeLapseInterval != 0) || + (disMode.equals("enable")) || + ((hdr != null) && (!hdr.equals("off"))) ) { + Log.v(TAG,"HDR/DIS/Time Lapse ON for HFR selection, turning HFR off"); + Toast.makeText(mActivity, R.string.error_app_unsupported_hfr_selection, + Toast.LENGTH_LONG).show(); + mParameters.setVideoHighFrameRate("off"); + mUI.overrideSettings(CameraSettings.KEY_VIDEO_HIGH_FRAME_RATE,"off"); + } + } + + //getSupportedPictureSizes will always send a sorted a list in descending order + Size biggestSize = mParameters.getSupportedPictureSizes().get(0); + + if (biggestSize.width <= videoWidth || biggestSize.height <= videoHeight) { + if (disMode.equals("enable")) { + Log.v(TAG,"DIS is not supported for this video quality"); + Toast.makeText(mActivity, R.string.error_app_unsupported_dis, + Toast.LENGTH_LONG).show(); + mParameters.set(CameraSettings.KEY_QC_DIS_MODE, "disable"); + mUI.overrideSettings(CameraSettings.KEY_DIS,"disable"); + } + } } @SuppressWarnings("deprecation") private void setCameraParameters() { @@ -2071,9 +2170,6 @@ public class VideoModule implements CameraModule, mParameters.setPreviewFrameRate(mProfile.videoFrameRate); } - // Set video mode - CameraSettings.setVideoMode(mParameters, true); - forceFlashOffIfSupported(!mPreviewFocused); videoWidth = mProfile.videoFrameWidth; @@ -2235,6 +2331,7 @@ public class VideoModule implements CameraModule, } mUI.updateOnScreenIndicators(mParameters, mPreferences); mActivity.initPowerShutter(mPreferences); + mActivity.initMaxBrightness(mPreferences); } } |