From ed5d55da373dc8076ed363a6185880db0624185d Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Mon, 16 Dec 2019 11:40:27 +0100 Subject: [PATCH] Add CameraOptions.getSupportedFrameProcessingFormats(), tests --- .../engine/options/Camera1OptionsTest.java | 7 +++++++ .../com/otaliastudios/cameraview/CameraOptions.java | 13 +++++++++++++ .../cameraview/engine/options/Camera1Options.java | 4 ++++ .../cameraview/engine/options/Camera2Options.java | 10 ++++++++++ docs/_posts/2018-12-20-frame-processing.md | 1 + 5 files changed, 35 insertions(+) diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/options/Camera1OptionsTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/options/Camera1OptionsTest.java index 8db1d61c..4dbbe0b4 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/options/Camera1OptionsTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/options/Camera1OptionsTest.java @@ -1,6 +1,7 @@ package com.otaliastudios.cameraview.engine.options; +import android.graphics.ImageFormat; import android.hardware.Camera; import com.otaliastudios.cameraview.BaseTest; @@ -8,6 +9,7 @@ import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.controls.Audio; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; +import com.otaliastudios.cameraview.controls.PictureFormat; import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.controls.Grid; @@ -54,6 +56,11 @@ public class Camera1OptionsTest extends BaseTest { assertFalse(o.isZoomSupported()); assertEquals(o.getExposureCorrectionMaxValue(), 0f, 0); assertEquals(o.getExposureCorrectionMinValue(), 0f, 0); + // Static + assertEquals(1, o.getSupportedPictureFormats().size()); + assertTrue(o.getSupportedPictureFormats().contains(PictureFormat.JPEG)); + assertEquals(1, o.getSupportedFrameProcessingFormats().size()); + assertTrue(o.getSupportedFrameProcessingFormats().contains(ImageFormat.NV21)); } private Camera.Size mockCameraSize(int width, int height) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java index 9095412d..c6b9f15a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java @@ -56,6 +56,7 @@ public abstract class CameraOptions { protected Set supportedPictureAspectRatio = new HashSet<>(4); protected Set supportedVideoAspectRatio = new HashSet<>(3); protected Set supportedPictureFormats = new HashSet<>(2); + protected Set supportedFrameProcessingFormats = new HashSet<>(2); protected boolean zoomSupported; protected boolean exposureCorrectionSupported; @@ -237,6 +238,18 @@ public abstract class CameraOptions { return Collections.unmodifiableSet(supportedPictureFormats); } + /** + * Set of supported formats for frame processing, + * as {@link ImageFormat} constants. + * + * @see CameraView#setFrameProcessingFormat(int) + * @return a collection of supported values. + */ + @NonNull + public final Collection getSupportedFrameProcessingFormats() { + return Collections.unmodifiableSet(supportedFrameProcessingFormats); + } + /** * Whether zoom is supported. If this is false, pinch-to-zoom * will not work and {@link CameraView#setZoom(float)} will have no effect. diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera1Options.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera1Options.java index dd8e1a7a..af629578 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera1Options.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera1Options.java @@ -1,5 +1,6 @@ package com.otaliastudios.cameraview.engine.options; +import android.graphics.ImageFormat; import android.hardware.Camera; import android.media.CamcorderProfile; @@ -128,5 +129,8 @@ public class Camera1Options extends CameraOptions { // Picture formats supportedPictureFormats.add(PictureFormat.JPEG); + + // Frame processing formats + supportedFrameProcessingFormats.add(ImageFormat.NV21); } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera2Options.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera2Options.java index 09791608..91a37a0d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera2Options.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/options/Camera2Options.java @@ -174,5 +174,15 @@ public class Camera2Options extends CameraOptions { } } } + + // Frame processing formats + supportedFrameProcessingFormats.add(ImageFormat.YUV_420_888); + int[] outputFormats = streamMap.getOutputFormats(); + for (int outputFormat : outputFormats) { + // Ensure it is a raw format + if (ImageFormat.getBitsPerPixel(outputFormat) > 0) { + supportedFrameProcessingFormats.add(outputFormat); + } + } } } diff --git a/docs/_posts/2018-12-20-frame-processing.md b/docs/_posts/2018-12-20-frame-processing.md index 6c64e197..6b221d26 100644 --- a/docs/_posts/2018-12-20-frame-processing.md +++ b/docs/_posts/2018-12-20-frame-processing.md @@ -115,6 +115,7 @@ cameraView.setFrameProcessingFormat(ImageFormat.YUV_422_888); ``` With the Camera1 engine, the incoming format will always be `ImageFormat.NV21`. +You can check which formats are available for use through `CameraOptions.getSupportedFrameProcessingFormats()`. ### XML Attributes