From e7c039b2559b1fa7ea7355e33434ad4f7d3dccc4 Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Thu, 28 Nov 2019 20:03:39 +0100 Subject: [PATCH] Complete engine/options logic for RAW --- .../cameraview/controls/PictureFormat.java | 2 -- .../cameraview/engine/Camera2Engine.java | 35 ++++++++++--------- .../engine/options/Camera2Options.java | 18 ++++++++-- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/controls/PictureFormat.java b/cameraview/src/main/java/com/otaliastudios/cameraview/controls/PictureFormat.java index 4ef82e00..796c590b 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/controls/PictureFormat.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/controls/PictureFormat.java @@ -6,8 +6,6 @@ import androidx.annotation.NonNull; import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraView; -import java.io.File; - /** * Format of the picture results for pictures that are taken with {@link CameraView#takePicture()}. * This does not apply to picture snapshots. 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 ff6f7dc6..3f51f481 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -387,7 +387,14 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv LOG.i("createCamera:", "Applying default parameters."); mCameraCharacteristics = mManager.getCameraCharacteristics(mCameraId); boolean flip = getAngles().flip(Reference.SENSOR, Reference.VIEW); - mCameraOptions = new Camera2Options(mManager, mCameraId, flip); + int format; + switch (mPictureFormat) { + case JPEG: format = ImageFormat.JPEG; break; + case DNG: format = ImageFormat.RAW_SENSOR; break; + default: throw new IllegalArgumentException("Unknown format:" + + mPictureFormat); + } + mCameraOptions = new Camera2Options(mManager, mCameraId, flip, format); createRepeatingRequestBuilder(CameraDevice.TEMPLATE_PREVIEW); } catch (CameraAccessException e) { task.trySetException(createCameraException(e)); @@ -484,23 +491,19 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv } // 3. PICTURE RECORDING + // Format is supported, or it would have thrown in Camera2Options constructor. if (getMode() == Mode.PICTURE) { - if (mCameraOptions.supports(mPictureFormat)) { - int format; - switch (mPictureFormat) { - case JPEG: format = ImageFormat.JPEG; break; - case DNG: format = ImageFormat.RAW_SENSOR; break; - default: throw new IllegalArgumentException("Unknown format:" + mPictureFormat); - } - mPictureReader = ImageReader.newInstance( - mCaptureSize.getWidth(), - mCaptureSize.getHeight(), - format, 2); - outputSurfaces.add(mPictureReader.getSurface()); - } else { - throw new IllegalStateException("Unsupported picture format: " + mPictureFormat - + ". Please check CameraOptions before applying."); + int format; + switch (mPictureFormat) { + case JPEG: format = ImageFormat.JPEG; break; + case DNG: format = ImageFormat.RAW_SENSOR; break; + default: throw new IllegalArgumentException("Unknown format:" + mPictureFormat); } + mPictureReader = ImageReader.newInstance( + mCaptureSize.getWidth(), + mCaptureSize.getHeight(), + format, 2); + outputSurfaces.add(mPictureReader.getSurface()); } // 4. FRAME PROCESSING 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 c5fc70d6..09791608 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 @@ -33,8 +33,9 @@ import static android.hardware.camera2.CameraCharacteristics.*; public class Camera2Options extends CameraOptions { public Camera2Options(@NonNull CameraManager manager, - @NonNull String cameraId, - boolean flipSizes) throws CameraAccessException { + @NonNull String cameraId, + boolean flipSizes, + int pictureFormat) throws CameraAccessException { Camera2Mapper mapper = Camera2Mapper.get(); CameraCharacteristics cameraCharacteristics = manager.getCameraCharacteristics(cameraId); @@ -114,7 +115,18 @@ public class Camera2Options extends CameraOptions { if (streamMap == null) { throw new RuntimeException("StreamConfigurationMap is null. Should not happen."); } - android.util.Size[] psizes = streamMap.getOutputSizes(ImageFormat.JPEG); + int[] pictureFormats = streamMap.getOutputFormats(); + boolean hasPictureFormat = false; + for (int picFormat : pictureFormats) { + if (picFormat == pictureFormat) { + hasPictureFormat = true; + break; + } + } + if (!hasPictureFormat) { + throw new IllegalStateException("Picture format not supported: " + pictureFormat); + } + android.util.Size[] psizes = streamMap.getOutputSizes(pictureFormat); for (android.util.Size size : psizes) { int width = flipSizes ? size.getHeight() : size.getWidth(); int height = flipSizes ? size.getWidth() : size.getHeight();