Merge "Ensure that two threads cannot simultaneously close SurfaceImage" into tm-dev

This commit is contained in:
Avichal Rakesh
2022-05-06 01:18:43 +00:00
committed by Android (Google) Code Review

View File

@@ -643,6 +643,9 @@ public class ImageReader implements AutoCloseable {
/** /**
* <p>Return the frame to the ImageReader for reuse.</p> * <p>Return the frame to the ImageReader for reuse.</p>
*
* This method should only be called via {@link SurfaceImage#close} which ensures that image
* closing is atomic.
*/ */
private void releaseImage(Image i) { private void releaseImage(Image i) {
if (! (i instanceof SurfaceImage) ) { if (! (i instanceof SurfaceImage) ) {
@@ -1125,6 +1128,8 @@ public class ImageReader implements AutoCloseable {
} }
private class SurfaceImage extends android.media.Image { private class SurfaceImage extends android.media.Image {
private final Object mCloseLock = new Object();
public SurfaceImage(int format) { public SurfaceImage(int format) {
mFormat = format; mFormat = format;
mHardwareBufferFormat = ImageReader.this.mHardwareBufferFormat; mHardwareBufferFormat = ImageReader.this.mHardwareBufferFormat;
@@ -1139,7 +1144,9 @@ public class ImageReader implements AutoCloseable {
@Override @Override
public void close() { public void close() {
ImageReader.this.releaseImage(this); synchronized (this.mCloseLock) {
ImageReader.this.releaseImage(this);
}
} }
public ImageReader getReader() { public ImageReader getReader() {