Avoid deadlocks in FullVideoRecorder

pull/696/head
Mattia Iavarone 6 years ago
parent d2446c2a3f
commit 7f2183d23e
  1. 25
      cameraview/src/main/java/com/otaliastudios/cameraview/video/FullVideoRecorder.java

@ -2,6 +2,7 @@ package com.otaliastudios.cameraview.video;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Handler;
import com.otaliastudios.cameraview.CameraLogger;
import com.otaliastudios.cameraview.VideoResult;
@ -219,16 +220,28 @@ public abstract class FullVideoRecorder extends VideoRecorder {
public void onInfo(MediaRecorder mediaRecorder, int what, int extra) {
LOG.i("OnInfoListener:", "Received info", what, extra,
"Thread: ", Thread.currentThread());
boolean shouldStop = false;
switch (what) {
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:
mResult.endReason = VideoResult.REASON_MAX_DURATION_REACHED;
stop(false);
shouldStop = true;
break;
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING:
mResult.endReason = VideoResult.REASON_MAX_SIZE_REACHED;
stop(false);
shouldStop = true;
break;
}
if (shouldStop) {
// Do not block this callback with a stop() call: stop() closes the
// MediaRecorder and I think that in some cases this creates a deadlock.
new Handler().post(new Runnable() {
@Override
public void run() {
LOG.i("OnInfoListener:", "Stopping");
stop(false);
}
});
}
}
});
mMediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@ -237,7 +250,13 @@ public abstract class FullVideoRecorder extends VideoRecorder {
LOG.e("OnErrorListener: got error", what, extra, ". Stopping.");
mResult = null;
mError = new RuntimeException("MediaRecorder error: " + what + " " + extra);
stop(false);
new Handler().post(new Runnable() {
@Override
public void run() {
LOG.i("OnErrorListener:", "Stopping");
stop(false);
}
});
}
});

Loading…
Cancel
Save