Commit 356a67ed authored by Christian Fremerey's avatar Christian Fremerey Committed by Commit Bot

[Image Capture, Android] Fix for "UnknownError: platform error"

Fixes an issue where takePhoto would occasionally fail due to a Java object
being released too early.

In particular, an ImageReader instance is created and its Surface object is
held on to and used asynchronously while the ImageReader goes out of scope and
may get garbage collected. The fix is to hold on to the ImageReader instance
for as long as the Surface may be used.

Bug: 846576
Change-Id: Icb0e3b247a1a75af8ce86c44774960c2b036083b
Reviewed-on: https://chromium-review.googlesource.com/1117854Reviewed-by: default avatarEmircan Uysaler <emircan@chromium.org>
Commit-Queue: Christian Fremerey <chfremer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#571574}
parent b43687e1
...@@ -166,9 +166,12 @@ public class VideoCaptureCamera2 extends VideoCapture { ...@@ -166,9 +166,12 @@ public class VideoCaptureCamera2 extends VideoCapture {
// Inner class to extend a Photo Session state change listener. // Inner class to extend a Photo Session state change listener.
// Error paths must signal notifyTakePhotoError(). // Error paths must signal notifyTakePhotoError().
private class CrPhotoSessionListener extends CameraCaptureSession.StateCallback { private class CrPhotoSessionListener extends CameraCaptureSession.StateCallback {
private final ImageReader mImageReader;
private final CaptureRequest mPhotoRequest; private final CaptureRequest mPhotoRequest;
private final long mCallbackId; private final long mCallbackId;
CrPhotoSessionListener(CaptureRequest photoRequest, long callbackId) { CrPhotoSessionListener(
ImageReader imageReader, CaptureRequest photoRequest, long callbackId) {
mImageReader = imageReader;
mPhotoRequest = photoRequest; mPhotoRequest = photoRequest;
mCallbackId = callbackId; mCallbackId = callbackId;
} }
...@@ -198,6 +201,11 @@ public class VideoCaptureCamera2 extends VideoCapture { ...@@ -198,6 +201,11 @@ public class VideoCaptureCamera2 extends VideoCapture {
notifyTakePhotoError(mCallbackId); notifyTakePhotoError(mCallbackId);
return; return;
} }
@Override
public void onClosed(CameraCaptureSession session) {
mImageReader.close();
}
}; };
// Internal class implementing an ImageReader listener for encoded Photos. // Internal class implementing an ImageReader listener for encoded Photos.
...@@ -1145,7 +1153,7 @@ public class VideoCaptureCamera2 extends VideoCapture { ...@@ -1145,7 +1153,7 @@ public class VideoCaptureCamera2 extends VideoCapture {
final CaptureRequest photoRequest = photoRequestBuilder.build(); final CaptureRequest photoRequest = photoRequestBuilder.build();
final CrPhotoSessionListener sessionListener = final CrPhotoSessionListener sessionListener =
new CrPhotoSessionListener(photoRequest, callbackId); new CrPhotoSessionListener(imageReader, photoRequest, callbackId);
try { try {
mCameraDevice.createCaptureSession(surfaceList, sessionListener, backgroundHandler); mCameraDevice.createCaptureSession(surfaceList, sessionListener, backgroundHandler);
} catch (CameraAccessException | IllegalArgumentException | SecurityException ex) { } catch (CameraAccessException | IllegalArgumentException | SecurityException ex) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment