summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/CaptureModule.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/CaptureModule.java')
-rw-r--r--src/com/android/camera/CaptureModule.java135
1 files changed, 107 insertions, 28 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java
index 899f40f7d..db0cef352 100644
--- a/src/com/android/camera/CaptureModule.java
+++ b/src/com/android/camera/CaptureModule.java
@@ -35,6 +35,7 @@ import android.graphics.RectF;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraConstrainedHighSpeedCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
@@ -62,6 +63,7 @@ import android.os.Message;
import android.os.SystemClock;
import android.provider.MediaStore;
import android.util.Log;
+import android.util.Range;
import android.util.Size;
import android.view.Display;
import android.view.KeyEvent;
@@ -270,6 +272,10 @@ public class CaptureModule implements CameraModule, PhotoController,
private long mRecordingTotalTime;
private boolean mRecordingTimeCountsDown = false;
private ImageReader mVideoSnapshotImageReader;
+ private Range mHighSpeedFPSRange;
+ private boolean mHighSpeedCapture = false;
+ private boolean mHighSpeedCaptureSlowMode = false; //HFR
+ private int mHighSpeedCaptureRate;
private class MediaSaveNotifyThread extends Thread {
private Uri uri;
@@ -2160,35 +2166,78 @@ public class CaptureModule implements CameraModule, PhotoController,
mFrameProcessor.setOutputSurface(surface);
mFrameProcessor.setVideoOutputSurface(mMediaRecorder.getSurface());
addPreviewSurface(mPreviewBuilder, surfaces, cameraId);
- surfaces.add(mVideoSnapshotImageReader.getSurface());
+ if (!mHighSpeedCapture) surfaces.add(mVideoSnapshotImageReader.getSurface());
+ else mPreviewBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, mHighSpeedFPSRange);
- mCameraDevice[cameraId].createCaptureSession(surfaces, new CameraCaptureSession
- .StateCallback() {
+ if (!mHighSpeedCapture) {
+ mCameraDevice[cameraId].createCaptureSession(surfaces, new CameraCaptureSession
+ .StateCallback() {
- @Override
- public void onConfigured(CameraCaptureSession cameraCaptureSession) {
- Log.d(TAG, "StartRecordingVideo session onConfigured");
- mCurrentSession = cameraCaptureSession;
- try {
- setUpVideoCaptureRequestBuilder(mPreviewBuilder);
- mCurrentSession.setRepeatingRequest(mPreviewBuilder.build(), null, mCameraHandler);
- } catch (CameraAccessException e) {
- e.printStackTrace();
+ @Override
+ public void onConfigured(CameraCaptureSession cameraCaptureSession) {
+ Log.d(TAG, "StartRecordingVideo session onConfigured");
+ mCurrentSession = cameraCaptureSession;
+ try {
+ setUpVideoCaptureRequestBuilder(mPreviewBuilder);
+ mCurrentSession.setRepeatingRequest(mPreviewBuilder.build(), null, mCameraHandler);
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
+ mMediaRecorder.start();
+ mUI.clearFocus();
+ mUI.resetPauseButton();
+ mRecordingTotalTime = 0L;
+ mRecordingStartTime = SystemClock.uptimeMillis();
+ mUI.showRecordingUI(true);
+ updateRecordingTime();
}
- mMediaRecorder.start();
- mUI.clearFocus();
- mUI.resetPauseButton();
- mRecordingTotalTime = 0L;
- mRecordingStartTime = SystemClock.uptimeMillis();
- mUI.showRecordingUI(true);
- updateRecordingTime();
- }
- @Override
- public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
- Toast.makeText(mActivity, "Video Failed", Toast.LENGTH_SHORT).show();
- }
- }, null);
+ @Override
+ public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
+ Toast.makeText(mActivity, "Video Failed", Toast.LENGTH_SHORT).show();
+ }
+ }, null);
+ } else {
+ mCameraDevice[cameraId].createConstrainedHighSpeedCaptureSession(surfaces, new
+ CameraConstrainedHighSpeedCaptureSession.StateCallback() {
+
+ @Override
+ public void onConfigured(CameraCaptureSession cameraCaptureSession) {
+ mCurrentSession = cameraCaptureSession;
+ CameraConstrainedHighSpeedCaptureSession session =
+ (CameraConstrainedHighSpeedCaptureSession) mCurrentSession;
+ try {
+ List list = session
+ .createHighSpeedRequestList(mPreviewBuilder.build());
+ session.setRepeatingBurst(list, null, mCameraHandler);
+ } catch (CameraAccessException e) {
+ Log.e(TAG, "Failed to start high speed video recording "
+ + e.getMessage());
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Failed to start high speed video recording "
+ + e.getMessage());
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Failed to start high speed video recording "
+ + e.getMessage());
+ e.printStackTrace();
+ }
+ mMediaRecorder.start();
+ mUI.clearFocus();
+ mUI.resetPauseButton();
+ mRecordingTotalTime = 0L;
+ mRecordingStartTime = SystemClock.uptimeMillis();
+ mUI.showRecordingUI(true);
+ updateRecordingTime();
+ }
+
+ @Override
+ public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
+ Toast.makeText(mActivity, "Failed", Toast.LENGTH_SHORT).show();
+ }
+ }, null);
+ }
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (IOException e) {
@@ -2206,6 +2255,19 @@ public class CaptureModule implements CameraModule, PhotoController,
mUI.showTimeLapseUI(mCaptureTimeLapse);
}
+ private void updateHFRSetting() {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_VIDEO_HIGH_FRAME_RATE);
+ if (value == null) return;
+ if (value.equals("off")) {
+ mHighSpeedCapture = false;
+ } else {
+ mHighSpeedCapture = true;
+ String mode = value.substring(0, 3);
+ mHighSpeedCaptureSlowMode = mode.equals("hsr");
+ mHighSpeedCaptureRate = Integer.parseInt(value.substring(3));
+ }
+ }
+
private void setUpVideoCaptureRequestBuilder(CaptureRequest.Builder builder) {
builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest
@@ -2429,8 +2491,11 @@ public class CaptureModule implements CameraModule, PhotoController,
Log.d(TAG, "setUpMediaRecorder");
String videoSize = mSettingsManager.getValue(SettingsManager.KEY_VIDEO_QUALITY);
int size = CameraSettings.VIDEO_QUALITY_TABLE.get(videoSize);
- if (mCaptureTimeLapse)
+ if (mCaptureTimeLapse) {
size = CameraSettings.getTimeLapseQualityFor(size);
+ }
+ updateHFRSetting();
+ boolean hfr = mHighSpeedCapture && !mHighSpeedCaptureSlowMode;
mProfile = CamcorderProfile.get(cameraId, size);
int videoEncoder = SettingTranslation
@@ -2440,7 +2505,7 @@ public class CaptureModule implements CameraModule, PhotoController,
int outputFormat = MediaRecorder.OutputFormat.MPEG_4;
- if (!mCaptureTimeLapse) {
+ if (!mCaptureTimeLapse && !hfr) {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
}
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
@@ -2457,7 +2522,7 @@ public class CaptureModule implements CameraModule, PhotoController,
mMediaRecorder.setVideoSize(mProfile.videoFrameWidth, mProfile.videoFrameHeight);
}
mMediaRecorder.setVideoEncoder(videoEncoder);
- if (!mCaptureTimeLapse) {
+ if (!mCaptureTimeLapse && !hfr) {
mMediaRecorder.setAudioEncodingBitRate(mProfile.audioBitRate);
mMediaRecorder.setAudioChannels(mProfile.audioChannels);
mMediaRecorder.setAudioSamplingRate(mProfile.audioSampleRate);
@@ -2467,7 +2532,21 @@ public class CaptureModule implements CameraModule, PhotoController,
if (mCaptureTimeLapse) {
double fps = 1000 / (double) mTimeBetweenTimeLapseFrameCaptureMs;
mMediaRecorder.setCaptureRate(fps);
+ } else if (mHighSpeedCapture) {
+ mHighSpeedFPSRange = new Range(mHighSpeedCaptureRate, mHighSpeedCaptureRate);
+ int fps = (int) mHighSpeedFPSRange.getUpper();
+ mMediaRecorder.setCaptureRate(fps);
+ if (mHighSpeedCaptureSlowMode) {
+ mMediaRecorder.setVideoFrameRate(30);
+ } else {
+ mMediaRecorder.setVideoFrameRate(fps);
+ }
+
+ int scaledBitrate = mProfile.videoBitRate * fps / mProfile.videoFrameRate;
+ Log.i(TAG, "Scaled Video bitrate : " + scaledBitrate);
+ mMediaRecorder.setVideoEncodingBitRate(scaledBitrate);
}
+
Location loc = mLocationManager.getCurrentLocation();
if (loc != null) {
mMediaRecorder.setLocation((float) loc.getLatitude(),