diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java index 8a51ef36..e15a8d08 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraListener.java @@ -127,4 +127,16 @@ public abstract class CameraListener { @UiThread public void onExposureCorrectionChanged(float newValue, @NonNull float[] bounds, @Nullable PointF[] fingers) { } + + /** + * Notifies that the actual video recording has started + * When we request for video recording, it doesn't start the recording the immediately. + * Instead it checks for hardware availability first and later on available, + * it sets all the config and then start the actual recording. + */ + @UiThread + public void onActualVideoRecordingStarted() { + + } + } \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index f7d5c08e..1f4e3bd5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -2062,6 +2062,19 @@ public class CameraView extends FrameLayout implements LifecycleObserver { } }); } + + @Override + public void onActualVideoRecordingStarted() { + mLogger.i("onActualVideoRecordingStarted", "onActualVideoRecordingStarted"); + mUiHandler.post(new Runnable() { + @Override + public void run() { + for (CameraListener listener : mListeners) { + listener.onActualVideoRecordingStarted(); + } + } + }); + } } //endregion diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java index 0efad6b2..9d910fd6 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -375,6 +375,11 @@ public class Camera1Engine extends CameraEngine implements } } + @Override + public void onActualVideoRecordingStarted() { + mCallback.onActualVideoRecordingStarted(); + } + //endregion //region Parameters 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 306954a3..4653748e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -726,6 +726,11 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv } } + @Override + public void onActualVideoRecordingStarted() { + mCallback.onActualVideoRecordingStarted(); + } + //endregion //region Parameters diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java index 4eea126a..48606262 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -134,6 +134,7 @@ public abstract class CameraEngine implements void dispatchOnExposureCorrectionChanged(float newValue, @NonNull float[] bounds, @Nullable PointF[] fingers); void dispatchFrame(Frame frame); void dispatchError(CameraException exception); + void onActualVideoRecordingStarted(); } private static final String TAG = CameraEngine.class.getSimpleName(); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/video/FullVideoRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/video/FullVideoRecorder.java index b21d6b63..fc253c56 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/video/FullVideoRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/video/FullVideoRecorder.java @@ -130,6 +130,7 @@ public abstract class FullVideoRecorder extends VideoRecorder { try { mMediaRecorder.start(); + dispatchActualVideoRecordingStarted(); } catch (Exception e) { LOG.w("start:", "Error while starting media recorder.", e); mResult = null; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java index 8a73aa76..10f05994 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/video/SnapshotVideoRecorder.java @@ -60,6 +60,7 @@ public class SnapshotVideoRecorder extends VideoRecorder implements RendererFram mPreview.addRendererFrameCallback(this); mFlipped = mEngine.getAngles().flip(Reference.SENSOR, Reference.VIEW); mDesiredState = STATE_RECORDING; + dispatchActualVideoRecordingStarted(); } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/video/VideoRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/video/VideoRecorder.java index 08f8870d..6d6c711c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/video/VideoRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/video/VideoRecorder.java @@ -24,6 +24,11 @@ public abstract class VideoRecorder { * @param exception the error or null if everything went fine */ void onVideoResult(@Nullable VideoResult.Stub result, @Nullable Exception exception); + + /** + * The callback for the actual video recording starting. + */ + void onActualVideoRecordingStarted(); } @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) VideoResult.Stub mResult; @@ -84,4 +89,14 @@ public abstract class VideoRecorder { mResult = null; mError = null; } + + /** + * Subclasses can call this to notify that the video recording has started, + * this will be called when camera is prepared and started. + */ + protected void dispatchActualVideoRecordingStarted(){ + if(mListener != null){ + mListener.onActualVideoRecordingStarted(); + } + } }