diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java index 3c0a2c17..88b44ee6 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java @@ -815,7 +815,15 @@ public abstract class CameraIntegrationTest extends BaseTest { if (camera.getCameraOptions().supports(PictureFormat.DNG)) { camera.takePicture(); PictureResult result = waitForPictureResult(true); - // TODO assert that result.getData() is a DNG file + // assert that result.getData() is a DNG file: + // We can use the first 4 bytes assuming they are the same as a TIFF file + // https://en.wikipedia.org/wiki/List_of_file_signatures + byte[] b = result.getData(); + boolean isII = b[0] == 'I' && b[1] == 'I' && b[2] == '*' && b[3] == '.'; + boolean isMM = b[0] == 'M' && b[1] == 'M' && b[2] == '.' && b[3] == '*'; + if (!isII && !isMM) { + throw new RuntimeException("Not a DNG file."); + } } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java index 9f8b6210..e6f017f7 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraUtils.java @@ -284,7 +284,7 @@ public class CameraUtils { ExifInterface exif = new ExifInterface(stream); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - orientation = ExifHelper.readExifOrientation(exifOrientation); + orientation = ExifHelper.getOrientation(exifOrientation); flip = exifOrientation == ExifInterface.ORIENTATION_FLIP_HORIZONTAL || exifOrientation == ExifInterface.ORIENTATION_FLIP_VERTICAL || exifOrientation == ExifInterface.ORIENTATION_TRANSPOSE || diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java index 461229e2..08b02e3a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/action/BaseAction.java @@ -39,7 +39,6 @@ public abstract class BaseAction implements Action { @Override public final void start(@NonNull ActionHolder holder) { - this.holder = holder; holder.addAction(this); if (holder.getLastResult(this) != null) { onStart(holder); @@ -63,7 +62,9 @@ public abstract class BaseAction implements Action { * holder stream. * @param holder holder */ + @CallSuper protected void onStart(@NonNull ActionHolder holder) { + this.holder = holder; // Overrideable } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/ExifHelper.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/ExifHelper.java index 83dc359e..a890124f 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/ExifHelper.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/utils/ExifHelper.java @@ -11,7 +11,7 @@ public class ExifHelper { * Maps an {@link ExifInterface} orientation value * to the actual degrees. */ - public static int readExifOrientation(int exifOrientation) { + public static int getOrientation(int exifOrientation) { int orientation; switch (exifOrientation) { case ExifInterface.ORIENTATION_NORMAL: @@ -34,5 +34,18 @@ public class ExifHelper { } return orientation; } + + /** + * Maps a degree value to {@link ExifInterface} constant. + */ + public static int getExifOrientation(int orientation) { + switch ((orientation + 360) % 360) { + case 0: return ExifInterface.ORIENTATION_NORMAL; + case 90: return ExifInterface.ORIENTATION_ROTATE_90; + case 180: return ExifInterface.ORIENTATION_ROTATE_180; + case 270: return ExifInterface.ORIENTATION_ROTATE_270; + default: throw new IllegalArgumentException("Invalid orientation: " + orientation); + } + } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full1PictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full1PictureRecorder.java index 9ec28779..d93ca9b1 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full1PictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full1PictureRecorder.java @@ -57,7 +57,7 @@ public class Full1PictureRecorder extends PictureRecorder { int exifOrientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - exifRotation = ExifHelper.readExifOrientation(exifOrientation); + exifRotation = ExifHelper.getOrientation(exifOrientation); } catch (IOException e) { exifRotation = 0; } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java index 9c47d3a2..6cfe8191 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java @@ -23,7 +23,6 @@ import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStream; import java.nio.ByteBuffer; import androidx.annotation.NonNull; @@ -93,7 +92,7 @@ public class Full2PictureRecorder extends PictureRecorder super.onCaptureCompleted(holder, request, result); if (mResult.format == PictureFormat.DNG) { mDngCreator = new DngCreator(holder.getCharacteristics(this), result); - mDngCreator.setOrientation(mResult.rotation); + mDngCreator.setOrientation(ExifHelper.getExifOrientation(mResult.rotation)); if (mResult.location != null) { mDngCreator.setLocation(mResult.location); } @@ -148,7 +147,7 @@ public class Full2PictureRecorder extends PictureRecorder ExifInterface exif = new ExifInterface(new ByteArrayInputStream(mResult.data)); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); - mResult.rotation = ExifHelper.readExifOrientation(exifOrientation); + mResult.rotation = ExifHelper.getOrientation(exifOrientation); } catch (IOException ignore) { } } diff --git a/cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/ExifHelperTest.java b/cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/ExifHelperTest.java index 4f4ccb7f..319f2096 100644 --- a/cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/ExifHelperTest.java +++ b/cameraview/src/test/java/com/otaliastudios/cameraview/internal/utils/ExifHelperTest.java @@ -3,13 +3,8 @@ package com.otaliastudios.cameraview.internal.utils; import androidx.exifinterface.media.ExifInterface; -import org.junit.After; -import org.junit.Before; import org.junit.Test; -import java.util.ArrayList; -import java.util.List; - import static junit.framework.Assert.assertNotNull; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -20,22 +15,22 @@ public class ExifHelperTest { @Test public void testValues() { - assertEquals(0, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_NORMAL)); - assertEquals(0, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_FLIP_HORIZONTAL)); - assertEquals(180, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_ROTATE_180)); - assertEquals(180, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_FLIP_VERTICAL)); - assertEquals(90, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_ROTATE_90)); - assertEquals(90, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_TRANSPOSE)); - assertEquals(270, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_ROTATE_270)); - assertEquals(270, ExifHelper.readExifOrientation(ExifInterface.ORIENTATION_TRANSVERSE)); + assertEquals(0, ExifHelper.getOrientation(ExifInterface.ORIENTATION_NORMAL)); + assertEquals(0, ExifHelper.getOrientation(ExifInterface.ORIENTATION_FLIP_HORIZONTAL)); + assertEquals(180, ExifHelper.getOrientation(ExifInterface.ORIENTATION_ROTATE_180)); + assertEquals(180, ExifHelper.getOrientation(ExifInterface.ORIENTATION_FLIP_VERTICAL)); + assertEquals(90, ExifHelper.getOrientation(ExifInterface.ORIENTATION_ROTATE_90)); + assertEquals(90, ExifHelper.getOrientation(ExifInterface.ORIENTATION_TRANSPOSE)); + assertEquals(270, ExifHelper.getOrientation(ExifInterface.ORIENTATION_ROTATE_270)); + assertEquals(270, ExifHelper.getOrientation(ExifInterface.ORIENTATION_TRANSVERSE)); } @Test public void testUnknownValues() { - assertEquals(0, ExifHelper.readExifOrientation(-15)); - assertEquals(0, ExifHelper.readExifOrientation(-1)); - assertEquals(0, ExifHelper.readExifOrientation(195)); - assertEquals(0, ExifHelper.readExifOrientation(Integer.MAX_VALUE)); + assertEquals(0, ExifHelper.getOrientation(-15)); + assertEquals(0, ExifHelper.getOrientation(-1)); + assertEquals(0, ExifHelper.getOrientation(195)); + assertEquals(0, ExifHelper.getOrientation(Integer.MAX_VALUE)); } }