Quick fixes & bump version (#471)

* Fix #460

* Fix #419

* Fix #443

* Bump version

* Fix #425

* Fix test
pull/477/head v2.0.0-beta05
Mattia Iavarone 6 years ago committed by GitHub
parent b9620b70e6
commit 8b66d5b575
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 2
      cameraview/build.gradle
  3. 2
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/VideoRecorderTest.java
  4. 8
      cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java
  5. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  6. 9
      cameraview/src/main/java/com/otaliastudios/cameraview/FullVideoRecorder.java
  7. 7
      cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotPictureRecorder.java
  8. 7
      cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java
  9. 6
      cameraview/src/main/java/com/otaliastudios/cameraview/VideoRecorder.java
  10. 15
      docs/_posts/2018-12-20-changelog.md
  11. 2
      docs/_posts/2018-12-20-install.md

@ -22,7 +22,7 @@ CameraView is a well documented, high-level library that makes capturing picture
addressing most of the common issues and needs, and still leaving you with flexibility where needed. addressing most of the common issues and needs, and still leaving you with flexibility where needed.
```groovy ```groovy
compile 'com.otaliastudios:cameraview:2.0.0-beta04' compile 'com.otaliastudios:cameraview:2.0.0-beta05'
``` ```
- Fast & reliable - Fast & reliable

@ -3,7 +3,7 @@ apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray' apply plugin: 'com.jfrog.bintray'
// Required by bintray // Required by bintray
version = '2.0.0-beta04' version = '2.0.0-beta05'
group = 'com.otaliastudios' group = 'com.otaliastudios'
//region android dependencies //region android dependencies

@ -28,7 +28,7 @@ public class VideoRecorderTest extends BaseTest {
}; };
recorder.start(); recorder.start();
recorder.stop(); recorder.stop();
Mockito.verify(listener, Mockito.times(1)).onVideoResult(result); Mockito.verify(listener, Mockito.times(1)).onVideoResult(result, null);
assertNull(recorder.mListener); assertNull(recorder.mListener);
assertNull(recorder.mResult); assertNull(recorder.mResult);
} }

@ -336,7 +336,7 @@ class Camera1 extends CameraController implements Camera.PreviewCallback, Camera
return; return;
} }
LOG.e("Error inside the onError callback.", error); LOG.e("Internal Camera1 error.", error);
Exception runtime = new RuntimeException(CameraLogger.lastMessage); Exception runtime = new RuntimeException(CameraLogger.lastMessage);
int reason; int reason;
switch (error) { switch (error) {
@ -646,13 +646,13 @@ class Camera1 extends CameraController implements Camera.PreviewCallback, Camera
// Video recording stuff. // Video recording stuff.
@Override @Override
public void onVideoResult(@Nullable VideoResult result) { public void onVideoResult(@Nullable VideoResult result, @Nullable Exception exception) {
mVideoRecorder = null; mVideoRecorder = null;
if (result != null) { if (result != null) {
mCameraCallbacks.dispatchOnVideoTaken(result); mCameraCallbacks.dispatchOnVideoTaken(result);
} else { } else {
// Something went wrong, lock the camera again. // Something went wrong, lock the camera again.
mCameraCallbacks.dispatchError(new CameraException(CameraException.REASON_VIDEO_FAILED)); mCameraCallbacks.dispatchError(new CameraException(exception, CameraException.REASON_VIDEO_FAILED));
mCamera.lock(); mCamera.lock();
} }
} }
@ -689,7 +689,7 @@ class Camera1 extends CameraController implements Camera.PreviewCallback, Camera
} catch (Exception e) { } catch (Exception e) {
// If this failed, we are unlikely able to record the video. // If this failed, we are unlikely able to record the video.
// Dispatch an error. // Dispatch an error.
onVideoResult(null); onVideoResult(null, e);
return; return;
} }
mVideoRecorder = new FullVideoRecorder(videoResult, Camera1.this, mVideoRecorder = new FullVideoRecorder(videoResult, Camera1.this,

@ -104,7 +104,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
Facing facing = Facing.fromValue(a.getInteger(R.styleable.CameraView_cameraFacing, Facing.DEFAULT(context).value())); Facing facing = Facing.fromValue(a.getInteger(R.styleable.CameraView_cameraFacing, Facing.DEFAULT(context).value()));
Flash flash = Flash.fromValue(a.getInteger(R.styleable.CameraView_cameraFlash, Flash.DEFAULT.value())); Flash flash = Flash.fromValue(a.getInteger(R.styleable.CameraView_cameraFlash, Flash.DEFAULT.value()));
Grid grid = Grid.fromValue(a.getInteger(R.styleable.CameraView_cameraGrid, Grid.DEFAULT.value())); Grid grid = Grid.fromValue(a.getInteger(R.styleable.CameraView_cameraGrid, Grid.DEFAULT.value()));
int gridColor = a.getColor(R.styleable.CameraView_cameraGrid, GridLinesLayout.DEFAULT_COLOR); int gridColor = a.getColor(R.styleable.CameraView_cameraGridColor, GridLinesLayout.DEFAULT_COLOR);
WhiteBalance whiteBalance = WhiteBalance.fromValue(a.getInteger(R.styleable.CameraView_cameraWhiteBalance, WhiteBalance.DEFAULT.value())); WhiteBalance whiteBalance = WhiteBalance.fromValue(a.getInteger(R.styleable.CameraView_cameraWhiteBalance, WhiteBalance.DEFAULT.value()));
Mode mode = Mode.fromValue(a.getInteger(R.styleable.CameraView_cameraMode, Mode.DEFAULT.value())); Mode mode = Mode.fromValue(a.getInteger(R.styleable.CameraView_cameraMode, Mode.DEFAULT.value()));
Hdr hdr = Hdr.fromValue(a.getInteger(R.styleable.CameraView_cameraHdr, Hdr.DEFAULT.value())); Hdr hdr = Hdr.fromValue(a.getInteger(R.styleable.CameraView_cameraHdr, Hdr.DEFAULT.value()));

@ -104,7 +104,9 @@ class FullVideoRecorder extends VideoRecorder {
mMediaRecorder.prepare(); mMediaRecorder.prepare();
mMediaRecorder.start(); mMediaRecorder.start();
} catch (Exception e) { } catch (Exception e) {
LOG.w("stop:", "Error while starting media recorder.", e);
mResult = null; mResult = null;
mError = e;
stop(); stop();
} }
} }
@ -115,9 +117,12 @@ class FullVideoRecorder extends VideoRecorder {
try { try {
mMediaRecorder.stop(); mMediaRecorder.stop();
} catch (Exception e) { } catch (Exception e) {
// This can happen if stopVideo() is called right after takeVideo(). We don't care. LOG.w("stop:", "Error while closing media recorder.", e);
// This can happen if stopVideo() is called right after takeVideo() (in which case we don't care)
// Or when prepare()/start() have failed for some reason and we are not allowed to call stop.
// Make sure we don't override the error if one exists already.
mResult = null; mResult = null;
LOG.w("stop:", "Error while closing media recorder. Swallowing", e); if (mError == null) mError = e;
} }
mMediaRecorder.release(); mMediaRecorder.release();
if (mController != null) { if (mController != null) {

@ -1,6 +1,7 @@
package com.otaliastudios.cameraview; package com.otaliastudios.cameraview;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.ImageFormat; import android.graphics.ImageFormat;
import android.graphics.Rect; import android.graphics.Rect;
@ -10,6 +11,8 @@ import android.hardware.Camera;
import android.opengl.EGL14; import android.opengl.EGL14;
import android.opengl.EGLContext; import android.opengl.EGLContext;
import android.opengl.Matrix; import android.opengl.Matrix;
import android.os.Build;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@ -42,14 +45,14 @@ class SnapshotPictureRecorder extends PictureRecorder {
@Override @Override
void take() { void take() {
if (mPreview instanceof GlCameraPreview) { if (mPreview instanceof GlCameraPreview && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
takeGl((GlCameraPreview) mPreview); takeGl((GlCameraPreview) mPreview);
} else { } else {
takeLegacy(); takeLegacy();
} }
} }
@SuppressLint("NewApi") @TargetApi(Build.VERSION_CODES.KITKAT)
private void takeGl(@NonNull final GlCameraPreview preview) { private void takeGl(@NonNull final GlCameraPreview preview) {
preview.addRendererFrameCallback(new GlCameraPreview.RendererFrameCallback() { preview.addRendererFrameCallback(new GlCameraPreview.RendererFrameCallback() {

@ -124,7 +124,9 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren
// If something failed, undo the result, since this is the mechanism // If something failed, undo the result, since this is the mechanism
// to notify Camera1 about this. // to notify Camera1 about this.
if (e != null) { if (e != null) {
LOG.e("Error onEncoderStop", e);
mResult = null; mResult = null;
mError = e;
} else { } else {
if (stopReason == MediaEncoderEngine.STOP_BY_MAX_DURATION) { if (stopReason == MediaEncoderEngine.STOP_BY_MAX_DURATION) {
mResult.endReason = VideoResult.REASON_MAX_DURATION_REACHED; mResult.endReason = VideoResult.REASON_MAX_DURATION_REACHED;
@ -132,11 +134,14 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren
mResult.endReason = VideoResult.REASON_MAX_SIZE_REACHED; mResult.endReason = VideoResult.REASON_MAX_SIZE_REACHED;
} }
} }
mEncoderEngine = null; // Cleanup
mCurrentState = STATE_NOT_RECORDING;
mDesiredState = STATE_NOT_RECORDING;
if (mPreview != null) { if (mPreview != null) {
mPreview.removeRendererFrameCallback(SnapshotVideoRecorder.this); mPreview.removeRendererFrameCallback(SnapshotVideoRecorder.this);
mPreview = null; mPreview = null;
} }
mEncoderEngine = null;
dispatchResult(); dispatchResult();
} }
} }

@ -12,6 +12,7 @@ abstract class VideoRecorder {
/* tests */ VideoResult mResult; /* tests */ VideoResult mResult;
/* tests */ VideoResultListener mListener; /* tests */ VideoResultListener mListener;
protected Exception mError;
VideoRecorder(@NonNull VideoResult stub, @Nullable VideoResultListener listener) { VideoRecorder(@NonNull VideoResult stub, @Nullable VideoResultListener listener) {
mResult = stub; mResult = stub;
@ -25,14 +26,15 @@ abstract class VideoRecorder {
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
protected void dispatchResult() { protected void dispatchResult() {
if (mListener != null) { if (mListener != null) {
mListener.onVideoResult(mResult); mListener.onVideoResult(mResult, mError);
mListener = null; mListener = null;
mResult = null; mResult = null;
mError = null;
} }
} }
interface VideoResultListener { interface VideoResultListener {
void onVideoResult(@Nullable VideoResult result); void onVideoResult(@Nullable VideoResult result, @Nullable Exception exception);
} }
} }

@ -8,6 +8,13 @@ order: 3
New versions are released through GitHub, so the reference page is the [GitHub Releases](https://github.com/natario1/CameraView/releases) page. New versions are released through GitHub, so the reference page is the [GitHub Releases](https://github.com/natario1/CameraView/releases) page.
### v2.0.0-beta05
- Fixed `FrameProcessor` freeze and release behavior, was broken ([#431][431])
- New: new api `setAutoFocusResetDelay` to control the delay to reset the focus after autofocus was performed, thanks to [@cneuwirt][cneuwirt] ([#435][435])
- Faster camera preview on layout changes ([#403][403])
- A few bug fixes ([#471][471])
### v2.0.0-beta04 ### v2.0.0-beta04
- Renames setPreviewSize to setPreviewStreamSize (previewSize suggests it is related to the view size but it's not) ([#393][393]) - Renames setPreviewSize to setPreviewStreamSize (previewSize suggests it is related to the view size but it's not) ([#393][393])
@ -28,8 +35,14 @@ New versions are released through GitHub, so the reference page is the [GitHub R
This is the first beta release. For changes with respect to v1, please take a look at the [migration guide](../extra/v1-migration-guide.html). This is the first beta release. For changes with respect to v1, please take a look at the [migration guide](../extra/v1-migration-guide.html).
[cneuwirt]: https://github.com/cneuwirt
[356]: https://github.com/natario1/CameraView/pull/356 [356]: https://github.com/natario1/CameraView/pull/356
[360]: https://github.com/natario1/CameraView/pull/360 [360]: https://github.com/natario1/CameraView/pull/360
[374]: https://github.com/natario1/CameraView/pull/374 [374]: https://github.com/natario1/CameraView/pull/374
[392]: https://github.com/natario1/CameraView/pull/392 [392]: https://github.com/natario1/CameraView/pull/392
[393]: https://github.com/natario1/CameraView/pull/393 [393]: https://github.com/natario1/CameraView/pull/393
[471]: https://github.com/natario1/CameraView/pull/471
[431]: https://github.com/natario1/CameraView/pull/431
[403]: https://github.com/natario1/CameraView/pull/403
[435]: https://github.com/natario1/CameraView/pull/435

@ -24,7 +24,7 @@ allprojects {
Then simply download the latest version: Then simply download the latest version:
```groovy ```groovy
api 'com.otaliastudios:cameraview:2.0.0-beta04' api 'com.otaliastudios:cameraview:2.0.0-beta05'
``` ```
No other configuration steps are needed. No other configuration steps are needed.
Loading…
Cancel
Save