Implement DNG support into the CameraEngine, restart if needed

pull/691/head
Mattia Iavarone 6 years ago
parent f58cb89c5c
commit 406f121731
  1. 15
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/CameraIntegrationTest.java
  2. 6
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java
  3. 9
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java
  4. 45
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  5. 13
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java

@ -23,6 +23,7 @@ import com.otaliastudios.cameraview.controls.Engine;
import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.controls.Mode;
import com.otaliastudios.cameraview.controls.PictureFormat;
import com.otaliastudios.cameraview.controls.WhiteBalance; import com.otaliastudios.cameraview.controls.WhiteBalance;
import com.otaliastudios.cameraview.frame.Frame; import com.otaliastudios.cameraview.frame.Frame;
import com.otaliastudios.cameraview.frame.FrameProcessor; import com.otaliastudios.cameraview.frame.FrameProcessor;
@ -806,6 +807,20 @@ public abstract class CameraIntegrationTest extends BaseTest {
//endregion //endregion
//region Picture Formats
@Test
public void testPictureFormat_DNG() {
openSync(true);
if (camera.getCameraOptions().supports(PictureFormat.DNG)) {
camera.takePicture();
PictureResult result = waitForPictureResult(true);
// TODO assert that result.getData() is a DNG file
}
}
//endregion
//region Frame Processing //region Frame Processing
private void assert30Frames(FrameProcessor mock) throws Exception { private void assert30Frames(FrameProcessor mock) throws Exception {

@ -11,6 +11,7 @@ import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.VideoResult;
import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.controls.PictureFormat;
import com.otaliastudios.cameraview.frame.FrameManager; import com.otaliastudios.cameraview.frame.FrameManager;
import com.otaliastudios.cameraview.gesture.Gesture; import com.otaliastudios.cameraview.gesture.Gesture;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
@ -116,6 +117,11 @@ public class MockCameraEngine extends CameraEngine {
mLocation = location; mLocation = location;
} }
@Override
public void setPictureFormat(@NonNull PictureFormat pictureFormat) {
mPictureFormat = pictureFormat;
}
@Override @Override
public void takePicture(@NonNull PictureResult.Stub stub) { public void takePicture(@NonNull PictureResult.Stub stub) {
super.takePicture(stub); super.takePicture(stub);

@ -21,6 +21,7 @@ import com.google.android.gms.tasks.Tasks;
import com.otaliastudios.cameraview.CameraException; import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.controls.PictureFormat;
import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper;
import com.otaliastudios.cameraview.engine.offset.Axis; import com.otaliastudios.cameraview.engine.offset.Axis;
import com.otaliastudios.cameraview.engine.offset.Reference; import com.otaliastudios.cameraview.engine.offset.Reference;
@ -717,6 +718,14 @@ public class Camera1Engine extends CameraEngine implements
return false; return false;
} }
@Override
public void setPictureFormat(@NonNull PictureFormat pictureFormat) {
if (pictureFormat != PictureFormat.JPEG) {
throw new UnsupportedOperationException("Unsupported picture format: " + pictureFormat);
}
mPictureFormat = pictureFormat;
}
//endregion //endregion
//region Frame Processing //region Frame Processing

@ -42,6 +42,7 @@ import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash; import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Hdr;
import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.controls.Mode;
import com.otaliastudios.cameraview.controls.PictureFormat;
import com.otaliastudios.cameraview.controls.WhiteBalance; import com.otaliastudios.cameraview.controls.WhiteBalance;
import com.otaliastudios.cameraview.engine.action.Action; import com.otaliastudios.cameraview.engine.action.Action;
import com.otaliastudios.cameraview.engine.action.ActionHolder; import com.otaliastudios.cameraview.engine.action.ActionHolder;
@ -484,13 +485,22 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
// 3. PICTURE RECORDING // 3. PICTURE RECORDING
if (getMode() == Mode.PICTURE) { if (getMode() == Mode.PICTURE) {
mPictureReader = ImageReader.newInstance( if (mCameraOptions.supports(mPictureFormat)) {
mCaptureSize.getWidth(), int format;
mCaptureSize.getHeight(), switch (mPictureFormat) {
ImageFormat.JPEG, case JPEG: format = ImageFormat.JPEG; break;
2 case DNG: format = ImageFormat.RAW_SENSOR; break;
); default: throw new IllegalArgumentException("Unknown format:" + mPictureFormat);
outputSurfaces.add(mPictureReader.getSurface()); }
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.");
}
} }
// 4. FRAME PROCESSING // 4. FRAME PROCESSING
@ -1317,6 +1327,27 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv
return false; return false;
} }
@Override
public void setPictureFormat(final @NonNull PictureFormat pictureFormat) {
LOG.i("setPictureFormat", "changing to", pictureFormat, "posting.");
if (pictureFormat == mPictureFormat) return;
mPictureFormat = pictureFormat;
mHandler.run(new Runnable() {
@Override
public void run() {
LOG.i("setPictureFormat", "changing to", pictureFormat,
"executing. BindState:", getBindState(),
"PreviewState:", getPreviewState());
if (getBindState() == STATE_STOPPED) {
LOG.i("setPictureFormat", "not bound so won't restart.");
} else {
LOG.i("setPictureFormat", "bound or binding. Calling restartBind()");
restartBind();
}
}
});
}
//endregion //endregion
//region Frame Processing //region Frame Processing

@ -18,7 +18,7 @@ import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions; import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.PictureResult; import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.engine.mappers.Camera1Mapper; import com.otaliastudios.cameraview.controls.PictureFormat;
import com.otaliastudios.cameraview.overlay.Overlay; import com.otaliastudios.cameraview.overlay.Overlay;
import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.VideoResult;
import com.otaliastudios.cameraview.engine.offset.Angles; import com.otaliastudios.cameraview.engine.offset.Angles;
@ -168,6 +168,7 @@ public abstract class CameraEngine implements
@SuppressWarnings("WeakerAccess") protected WhiteBalance mWhiteBalance; @SuppressWarnings("WeakerAccess") protected WhiteBalance mWhiteBalance;
@SuppressWarnings("WeakerAccess") protected VideoCodec mVideoCodec; @SuppressWarnings("WeakerAccess") protected VideoCodec mVideoCodec;
@SuppressWarnings("WeakerAccess") protected Hdr mHdr; @SuppressWarnings("WeakerAccess") protected Hdr mHdr;
@SuppressWarnings("WeakerAccess") protected PictureFormat mPictureFormat;
@SuppressWarnings("WeakerAccess") protected Location mLocation; @SuppressWarnings("WeakerAccess") protected Location mLocation;
@SuppressWarnings("WeakerAccess") protected float mZoomValue; @SuppressWarnings("WeakerAccess") protected float mZoomValue;
@SuppressWarnings("WeakerAccess") protected float mExposureCorrectionValue; @SuppressWarnings("WeakerAccess") protected float mExposureCorrectionValue;
@ -1020,6 +1021,11 @@ public abstract class CameraEngine implements
return mLocation; return mLocation;
} }
@NonNull
public final PictureFormat getPictureFormat() {
return mPictureFormat;
}
public final float getZoomValue() { public final float getZoomValue() {
return mZoomValue; return mZoomValue;
} }
@ -1109,6 +1115,9 @@ public abstract class CameraEngine implements
// If closed, keep. If opened, check supported and apply. // If closed, keep. If opened, check supported and apply.
public abstract void setLocation(@Nullable Location location); public abstract void setLocation(@Nullable Location location);
// If closed, keep. If opened, check supported and apply.
public abstract void setPictureFormat(@NonNull PictureFormat pictureFormat);
public abstract void startAutoFocus(@Nullable Gesture gesture, @NonNull PointF point); public abstract void startAutoFocus(@Nullable Gesture gesture, @NonNull PointF point);
public abstract void setPlaySounds(boolean playSounds); public abstract void setPlaySounds(boolean playSounds);
@ -1139,6 +1148,7 @@ public abstract class CameraEngine implements
stub.isSnapshot = false; stub.isSnapshot = false;
stub.location = mLocation; stub.location = mLocation;
stub.facing = mFacing; stub.facing = mFacing;
stub.format = mPictureFormat;
onTakePicture(stub, mPictureMetering); onTakePicture(stub, mPictureMetering);
} }
}); });
@ -1161,6 +1171,7 @@ public abstract class CameraEngine implements
stub.location = mLocation; stub.location = mLocation;
stub.isSnapshot = true; stub.isSnapshot = true;
stub.facing = mFacing; stub.facing = mFacing;
stub.format = PictureFormat.JPEG;
// Leave the other parameters to subclasses. // Leave the other parameters to subclasses.
//noinspection ConstantConditions //noinspection ConstantConditions
AspectRatio ratio = AspectRatio.of(getPreviewSurfaceSize(Reference.OUTPUT)); AspectRatio ratio = AspectRatio.of(getPreviewSurfaceSize(Reference.OUTPUT));

Loading…
Cancel
Save