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