From 0bd20d1a8bc16c41543dcd238e75e4e0759fcb95 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Wed, 23 Oct 2019 21:17:45 +0200 Subject: [PATCH] Add to demo app --- .../cameraview/engine/Camera1Engine.java | 1 + .../cameraview/engine/Camera2Engine.java | 2 +- .../cameraview/demo/CameraActivity.java | 11 ++++- .../otaliastudios/cameraview/demo/Option.java | 43 ++++++++++++++++++- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java index 5a65ce71..f7111e85 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -392,6 +392,7 @@ public class Camera1Engine extends CameraEngine implements // The correct formula seems to be deviceOrientation+displayOffset, // which means offset(Reference.VIEW, Reference.OUTPUT, Axis.ABSOLUTE). stub.rotation = getAngles().offset(Reference.VIEW, Reference.OUTPUT, Axis.ABSOLUTE); + stub.videoFrameRate = Math.round(mPreviewFrameRate); LOG.i("onTakeVideoSnapshot", "rotation:", stub.rotation, "size:", stub.size); // Start. diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java index 4b712af0..c25dd20e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -814,7 +814,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv if (!(mPreview instanceof GlCameraPreview)) { throw new IllegalStateException("Video snapshots are only supported with GL_SURFACE."); } - stub.videoFrameRate = (int) mPreviewFrameRate; GlCameraPreview glPreview = (GlCameraPreview) mPreview; Size outputSize = getUncroppedSnapshotSize(Reference.OUTPUT); if (outputSize == null) { @@ -833,6 +832,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv // Unlike Camera1, the correct formula seems to be deviceOrientation, // which means offset(Reference.BASE, Reference.OUTPUT, Axis.ABSOLUTE). stub.rotation = getAngles().offset(Reference.BASE, Reference.OUTPUT, Axis.ABSOLUTE); + stub.videoFrameRate = Math.round(mPreviewFrameRate); LOG.i("onTakeVideoSnapshot", "rotation:", stub.rotation, "size:", stub.size); // Start. diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java index e718e921..8e07625a 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java @@ -116,7 +116,7 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis new Option.Flash(), new Option.WhiteBalance(), new Option.Hdr(), new Option.PictureMetering(), new Option.PictureSnapshotMetering(), // Video recording - new Option.VideoCodec(), new Option.Audio(), + new Option.PreviewFrameRate(), new Option.VideoCodec(), new Option.Audio(), // Gestures new Option.Pinch(), new Option.HorizontalScroll(), new Option.VerticalScroll(), new Option.Tap(), new Option.LongTap(), @@ -128,12 +128,19 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis new Option.Grid(), new Option.GridColor(), new Option.UseDeviceOrientation() ); List dividers = Arrays.asList( + // Layout false, true, + // Engine and preview false, false, true, + // Some controls false, false, false, false, true, - false, true, + // Video recording + false, false, true, + // Gestures false, false, false, false, true, + // Watermarks false, false, true, + // Other false, false, true ); for (int i = 0; i < options.size(); i++) { diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java index 34f66279..0144004a 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/Option.java @@ -60,7 +60,7 @@ public abstract class Option { @Override public Collection getAll(@NonNull CameraView view, @NonNull CameraOptions options) { View root = (View) view.getParent(); - ArrayList list = new ArrayList<>(); + List list = new ArrayList<>(); int boundary = root.getWidth(); if (boundary == 0) boundary = 1000; int step = boundary / 10; @@ -506,4 +506,45 @@ public abstract class Option { view.setUseDeviceOrientation(value); } } + + public static class PreviewFrameRate extends Option { + public PreviewFrameRate() { + super("Preview FPS"); + } + + @NonNull + @Override + public Collection getAll(@NonNull CameraView view, @NonNull CameraOptions options) { + float min = options.getPreviewFrameRateMinValue(); + float max = options.getPreviewFrameRateMaxValue(); + float delta = max - min; + List result = new ArrayList<>(); + if (min == 0F && max == 0F) { + return result; // empty list + } else if (delta < 0.005F) { + result.add(Math.round(min)); + return result; // single value + } else { + final int steps = 3; + final float step = delta / steps; + for (int i = 0; i <= steps; i++) { + result.add(Math.round(min)); + min += step; + } + return result; + } + } + + @NonNull + @Override + public Integer get(@NonNull CameraView view) { + return Math.round(view.getPreviewFrameRate()); + } + + @Override + public void set(@NonNull CameraView view, @NonNull Integer value) { + view.setPreviewFrameRate((float) value); + } + } + }