Move Engine and Previews

pull/482/head
Mattia Iavarone 6 years ago
parent 46d03c0555
commit 04b075ee46
  1. 1
      cameraview/build.gradle
  2. 1
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraPreviewTest.java
  3. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java
  4. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java
  5. 3
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/GlCameraPreviewTest.java
  6. 6
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/IntegrationTest.java
  7. 1
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/MockCameraEngine.java
  8. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/MockCameraPreview.java
  9. 4
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/SurfaceCameraPreviewTest.java
  10. 3
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/TextureCameraPreviewTest.java
  11. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraOptions.java
  12. 8
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  13. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/FullVideoRecorder.java
  14. 0
      cameraview/src/main/java/com/otaliastudios/cameraview/GridLinesLayout.java
  15. 0
      cameraview/src/main/java/com/otaliastudios/cameraview/RendererThread.java
  16. 8
      cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotPictureRecorder.java
  17. 3
      cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java
  18. 35
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java
  19. 15
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java
  20. 7
      cameraview/src/main/java/com/otaliastudios/cameraview/preview/CameraPreview.java
  21. 10
      cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java
  22. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/preview/SurfaceCameraPreview.java
  23. 4
      cameraview/src/main/java/com/otaliastudios/cameraview/preview/TextureCameraPreview.java

@ -32,7 +32,6 @@ android {
}
sourceSets {
main.java.srcDirs += 'src/main/views'
main.java.srcDirs += 'src/main/utils'
main.java.srcDirs += 'src/main/gles'
}

@ -5,6 +5,7 @@ import android.content.Context;
import androidx.test.rule.ActivityTestRule;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.size.AspectRatio;
import com.otaliastudios.cameraview.size.Size;

@ -10,8 +10,10 @@ import androidx.test.filters.MediumTest;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.gesture.Gesture;
import com.otaliastudios.cameraview.gesture.GestureAction;
import com.otaliastudios.cameraview.preview.CameraPreview;
import org.junit.After;
import org.junit.Before;

@ -14,6 +14,7 @@ import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.controls.ControlParser;
import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.gesture.Gesture;
import com.otaliastudios.cameraview.gesture.GestureAction;
import com.otaliastudios.cameraview.controls.Grid;
@ -25,6 +26,7 @@ import com.otaliastudios.cameraview.gesture.GestureParser;
import com.otaliastudios.cameraview.gesture.PinchGestureLayout;
import com.otaliastudios.cameraview.gesture.ScrollGestureLayout;
import com.otaliastudios.cameraview.gesture.TapGestureLayout;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.size.Size;
import com.otaliastudios.cameraview.size.SizeSelector;
import com.otaliastudios.cameraview.size.SizeSelectors;

@ -7,6 +7,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.preview.GlCameraPreview;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)

@ -11,6 +11,8 @@ import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.controls.Hdr;
import com.otaliastudios.cameraview.controls.Mode;
import com.otaliastudios.cameraview.controls.WhiteBalance;
import com.otaliastudios.cameraview.engine.Camera1Engine;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.size.Size;
import androidx.annotation.NonNull;
@ -55,7 +57,7 @@ public class IntegrationTest extends BaseTest {
public ActivityTestRule<TestActivity> rule = new ActivityTestRule<>(TestActivity.class);
private CameraView camera;
private Camera1 controller;
private Camera1Engine controller;
private CameraListener listener;
private Task<Throwable> uiExceptionTask;
@ -74,7 +76,7 @@ public class IntegrationTest extends BaseTest {
camera = new CameraView(rule.getActivity()) {
@Override
protected CameraEngine instantiateCameraController(CameraCallbacks callbacks) {
controller = new Camera1(callbacks);
controller = new Camera1Engine(callbacks);
return controller;
}
};

@ -7,6 +7,7 @@ import android.location.Location;
import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.gesture.Gesture;
import com.otaliastudios.cameraview.controls.Hdr;
import com.otaliastudios.cameraview.controls.Mode;

@ -7,6 +7,8 @@ import androidx.annotation.NonNull;
import android.view.View;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.preview.CameraPreview;
public class MockCameraPreview extends CameraPreview<View, Void> {
MockCameraPreview(Context context, ViewGroup parent) {

@ -7,7 +7,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import android.view.ViewGroup;
import org.junit.Test;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.preview.SurfaceCameraPreview;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)

@ -7,6 +7,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.preview.TextureCameraPreview;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)

@ -48,7 +48,7 @@ public class CameraOptions {
private boolean autoFocusSupported;
// Camera1 constructor.
// Camera1Engine constructor.
@SuppressWarnings("deprecation")
CameraOptions(@NonNull Camera.Parameters params, boolean flipSizes) {
List<String> strings;

@ -33,6 +33,8 @@ import com.otaliastudios.cameraview.controls.Control;
import com.otaliastudios.cameraview.controls.ControlParser;
import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash;
import com.otaliastudios.cameraview.engine.Camera1Engine;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.gesture.Gesture;
import com.otaliastudios.cameraview.gesture.GestureAction;
import com.otaliastudios.cameraview.controls.Grid;
@ -46,6 +48,10 @@ import com.otaliastudios.cameraview.gesture.GestureParser;
import com.otaliastudios.cameraview.gesture.PinchGestureLayout;
import com.otaliastudios.cameraview.gesture.ScrollGestureLayout;
import com.otaliastudios.cameraview.gesture.TapGestureLayout;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.preview.GlCameraPreview;
import com.otaliastudios.cameraview.preview.SurfaceCameraPreview;
import com.otaliastudios.cameraview.preview.TextureCameraPreview;
import com.otaliastudios.cameraview.size.AspectRatio;
import com.otaliastudios.cameraview.size.Size;
import com.otaliastudios.cameraview.size.SizeSelector;
@ -197,7 +203,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
}
protected CameraEngine instantiateCameraController(CameraCallbacks callbacks) {
return new Camera1(callbacks);
return new Camera1Engine(callbacks);
}
protected CameraPreview instantiatePreview(Context context, ViewGroup container) {

@ -5,6 +5,7 @@ import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.engine.Camera1Engine;
import com.otaliastudios.cameraview.size.Size;
import androidx.annotation.NonNull;
@ -20,12 +21,12 @@ class FullVideoRecorder extends VideoRecorder {
private MediaRecorder mMediaRecorder;
private CamcorderProfile mProfile;
private Camera1 mController;
private Camera1Engine mController;
private Camera mCamera;
private Size mSize;
FullVideoRecorder(@NonNull VideoResult stub, @Nullable VideoResultListener listener,
@NonNull Camera1 controller, @NonNull Camera camera, int cameraId) {
@NonNull Camera1Engine controller, @NonNull Camera camera, int cameraId) {
super(stub, listener);
mCamera = camera;
mController = controller;

@ -13,6 +13,10 @@ import android.opengl.EGLContext;
import android.opengl.Matrix;
import android.os.Build;
import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.engine.Camera1Engine;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.preview.GlCameraPreview;
import com.otaliastudios.cameraview.size.AspectRatio;
import com.otaliastudios.cameraview.size.Size;
@ -28,14 +32,14 @@ class SnapshotPictureRecorder extends PictureRecorder {
private static final String TAG = SnapshotPictureRecorder.class.getSimpleName();
private static final CameraLogger LOG = CameraLogger.create(TAG);
private Camera1 mController;
private Camera1Engine mController;
private Camera mCamera;
private CameraPreview mPreview;
private AspectRatio mOutputRatio;
private Size mSensorPreviewSize;
private int mFormat;
SnapshotPictureRecorder(@NonNull PictureResult stub, @NonNull Camera1 controller,
SnapshotPictureRecorder(@NonNull PictureResult stub, @NonNull Camera1Engine controller,
@NonNull Camera camera, @NonNull AspectRatio outputRatio) {
super(stub, controller);
mController = controller;

@ -5,6 +5,7 @@ import android.opengl.EGL14;
import android.os.Build;
import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.preview.GlCameraPreview;
import com.otaliastudios.cameraview.size.Size;
import androidx.annotation.NonNull;
@ -125,7 +126,7 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren
@Override
public void onEncoderStop(int stopReason, @Nullable Exception e) {
// If something failed, undo the result, since this is the mechanism
// to notify Camera1 about this.
// to notify Camera1Engine about this.
if (e != null) {
LOG.e("Error onEncoderStop", e);
mResult = null;

@ -1,4 +1,4 @@
package com.otaliastudios.cameraview;
package com.otaliastudios.cameraview.engine;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
@ -14,6 +14,23 @@ import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import android.view.SurfaceHolder;
import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.CameraView;
import com.otaliastudios.cameraview.CropHelper;
import com.otaliastudios.cameraview.Frame;
import com.otaliastudios.cameraview.FullPictureRecorder;
import com.otaliastudios.cameraview.FullVideoRecorder;
import com.otaliastudios.cameraview.GlCameraPreview;
import com.otaliastudios.cameraview.Mapper1;
import com.otaliastudios.cameraview.PictureRecorder;
import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.SnapshotPictureRecorder;
import com.otaliastudios.cameraview.SnapshotVideoRecorder;
import com.otaliastudios.cameraview.Task;
import com.otaliastudios.cameraview.VideoRecorder;
import com.otaliastudios.cameraview.VideoResult;
import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash;
@ -31,11 +48,11 @@ import java.util.List;
@SuppressWarnings("deprecation")
class Camera1 extends CameraEngine implements Camera.PreviewCallback, Camera.ErrorCallback,
class Camera1Engine extends CameraEngine implements Camera.PreviewCallback, Camera.ErrorCallback,
VideoRecorder.VideoResultListener,
PictureRecorder.PictureResultListener {
private static final String TAG = Camera1.class.getSimpleName();
private static final String TAG = Camera1Engine.class.getSimpleName();
private static final CameraLogger LOG = CameraLogger.create(TAG);
private Camera mCamera;
@ -56,7 +73,7 @@ class Camera1 extends CameraEngine implements Camera.PreviewCallback, Camera.Err
}
};
Camera1(@NonNull CameraView.CameraCallbacks callback) {
Camera1Engine(@NonNull CameraView.CameraCallbacks callback) {
super(callback);
mMapper = new Mapper1();
}
@ -581,7 +598,7 @@ class Camera1 extends CameraEngine implements Camera.PreviewCallback, Camera.Err
result.rotation = offset(REF_SENSOR, REF_OUTPUT);
result.size = getPictureSize(REF_OUTPUT);
result.facing = mFacing;
mPictureRecorder = new FullPictureRecorder(result, Camera1.this, mCamera);
mPictureRecorder = new FullPictureRecorder(result, Camera1Engine.this, mCamera);
mPictureRecorder.take();
}
});
@ -616,7 +633,7 @@ class Camera1 extends CameraEngine implements Camera.PreviewCallback, Camera.Err
LOG.v("Rotations", "SO", offset(REF_SENSOR, REF_OUTPUT), "OS", offset(REF_OUTPUT, REF_SENSOR));
LOG.v("Rotations", "VO", offset(REF_VIEW, REF_OUTPUT), "OV", offset(REF_OUTPUT, REF_VIEW));
mPictureRecorder = new SnapshotPictureRecorder(result, Camera1.this, mCamera, outputRatio);
mPictureRecorder = new SnapshotPictureRecorder(result, Camera1Engine.this, mCamera, outputRatio);
mPictureRecorder.take();
}
});
@ -702,8 +719,8 @@ class Camera1 extends CameraEngine implements Camera.PreviewCallback, Camera.Err
onVideoResult(null, e);
return;
}
mVideoRecorder = new FullVideoRecorder(videoResult, Camera1.this,
Camera1.this, mCamera, mCameraId);
mVideoRecorder = new FullVideoRecorder(videoResult, Camera1Engine.this,
Camera1Engine.this, mCamera, mCameraId);
mVideoRecorder.start();
}
});
@ -790,7 +807,7 @@ class Camera1 extends CameraEngine implements Camera.PreviewCallback, Camera.Err
// Reset facing and start.
mFacing = realFacing;
GlCameraPreview cameraPreview = (GlCameraPreview) mPreview;
mVideoRecorder = new SnapshotVideoRecorder(videoResult, Camera1.this, cameraPreview);
mVideoRecorder = new SnapshotVideoRecorder(videoResult, Camera1Engine.this, cameraPreview);
mVideoRecorder.start();
}
});

@ -1,4 +1,4 @@
package com.otaliastudios.cameraview;
package com.otaliastudios.cameraview.engine;
import android.graphics.PointF;
import android.location.Location;
@ -7,6 +7,17 @@ import android.location.Location;
import android.os.Handler;
import android.os.Looper;
import com.otaliastudios.cameraview.CameraException;
import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.CameraOptions;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.CameraView;
import com.otaliastudios.cameraview.FrameManager;
import com.otaliastudios.cameraview.Mapper;
import com.otaliastudios.cameraview.PictureRecorder;
import com.otaliastudios.cameraview.Task;
import com.otaliastudios.cameraview.VideoRecorder;
import com.otaliastudios.cameraview.WorkerHandler;
import com.otaliastudios.cameraview.controls.Audio;
import com.otaliastudios.cameraview.controls.Facing;
import com.otaliastudios.cameraview.controls.Flash;
@ -30,7 +41,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
abstract class CameraEngine implements
public abstract class CameraEngine implements
CameraPreview.SurfaceCallback,
FrameManager.BufferCallback,
Thread.UncaughtExceptionHandler {

@ -1,4 +1,4 @@
package com.otaliastudios.cameraview;
package com.otaliastudios.cameraview.preview;
import android.content.Context;
import androidx.annotation.NonNull;
@ -6,6 +6,9 @@ import androidx.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.Task;
import com.otaliastudios.cameraview.engine.CameraEngine;
import com.otaliastudios.cameraview.size.Size;
/**
@ -15,7 +18,7 @@ import com.otaliastudios.cameraview.size.Size;
* @param <T> the type of view which hosts the content surface
* @param <Output> the type of output, either {@link android.view.SurfaceHolder} or {@link android.graphics.SurfaceTexture}
*/
abstract class CameraPreview<T extends View, Output> {
public abstract class CameraPreview<T extends View, Output> {
protected final static CameraLogger LOG = CameraLogger.create(CameraPreview.class.getSimpleName());

@ -1,4 +1,4 @@
package com.otaliastudios.cameraview;
package com.otaliastudios.cameraview.preview;
import android.content.Context;
import android.graphics.SurfaceTexture;
@ -12,6 +12,10 @@ import android.view.SurfaceHolder;
import android.view.View;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.EglViewport;
import com.otaliastudios.cameraview.R;
import com.otaliastudios.cameraview.RendererThread;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.size.AspectRatio;
import java.util.Collections;
@ -26,8 +30,8 @@ import javax.microedition.khronos.opengles.GL10;
*
* - in the SurfaceTexture constructor we pass the GL texture handle that we have created.
*
* - The SurfaceTexture is linked to the Camera1 object. The camera will pass down buffers of data with
* a specified size (that is, the Camera1 preview size). For this reason we don't have to specify
* - The SurfaceTexture is linked to the Camera1Engine object. The camera will pass down buffers of data with
* a specified size (that is, the Camera1Engine preview size). For this reason we don't have to specify
* surfaceTexture.setDefaultBufferSize() (like we do, for example, in SnapshotPictureRecorder).
*
* - When SurfaceTexture.updateTexImage() is called, it will fetch the latest texture image from the

@ -1,4 +1,4 @@
package com.otaliastudios.cameraview;
package com.otaliastudios.cameraview.preview;
import android.content.Context;
import androidx.annotation.NonNull;
@ -9,6 +9,9 @@ import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.R;
// Fallback preview when hardware acceleration is off.
// Currently this does NOT support cropping (e. g. the crop inside behavior),
// so we return false in supportsCropping() in order to have proper measuring.

@ -1,4 +1,4 @@
package com.otaliastudios.cameraview;
package com.otaliastudios.cameraview.preview;
import android.annotation.TargetApi;
import android.content.Context;
@ -10,6 +10,8 @@ import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import com.otaliastudios.cameraview.R;
import com.otaliastudios.cameraview.preview.CameraPreview;
import com.otaliastudios.cameraview.size.AspectRatio;
class TextureCameraPreview extends CameraPreview<TextureView, SurfaceTexture> {
Loading…
Cancel
Save