Camera: Avoid possible NPE when forwarding images
Use the local reader argument instead of the member variable which can get reset. Additionally, make sure to execute the extension forward processor 'ImageReader' callback using the extension session handler. Bug: 184447319 Test: atest -c cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java#testCloseCaptureSession --iterations=10 atest -c cts/tests/camera/src/android/hardware/camera2/cts/CameraExtensionSessionTest.java Change-Id: Id8f8818ad478b70438cbd18d46ef79263bc4de9d
This commit is contained in:
@@ -25,6 +25,7 @@ import android.media.Image;
|
||||
import android.media.ImageReader;
|
||||
import android.media.ImageWriter;
|
||||
import android.annotation.NonNull;
|
||||
import android.os.Handler;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
import android.util.Size;
|
||||
@@ -39,6 +40,7 @@ public class CameraExtensionForwardProcessor {
|
||||
private final IPreviewImageProcessorImpl mProcessor;
|
||||
private final long mOutputSurfaceUsage;
|
||||
private final int mOutputSurfaceFormat;
|
||||
private final Handler mHandler;
|
||||
|
||||
private ImageReader mIntermediateReader = null;
|
||||
private Surface mIntermediateSurface = null;
|
||||
@@ -48,10 +50,11 @@ public class CameraExtensionForwardProcessor {
|
||||
private boolean mOutputAbandoned = false;
|
||||
|
||||
public CameraExtensionForwardProcessor(@NonNull IPreviewImageProcessorImpl processor,
|
||||
int format, long surfaceUsage) {
|
||||
int format, long surfaceUsage, @NonNull Handler handler) {
|
||||
mProcessor = processor;
|
||||
mOutputSurfaceUsage = surfaceUsage;
|
||||
mOutputSurfaceFormat = format;
|
||||
mHandler = handler;
|
||||
}
|
||||
|
||||
public void close() {
|
||||
@@ -98,7 +101,7 @@ public class CameraExtensionForwardProcessor {
|
||||
mResolution.getHeight(), CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT,
|
||||
FORWARD_QUEUE_SIZE, mOutputSurfaceUsage);
|
||||
mIntermediateSurface = mIntermediateReader.getSurface();
|
||||
mIntermediateReader.setOnImageAvailableListener(new ForwardCallback(), null);
|
||||
mIntermediateReader.setOnImageAvailableListener(new ForwardCallback(), mHandler);
|
||||
|
||||
mProcessor.onOutputSurface(mIntermediateSurface, mOutputSurfaceFormat);
|
||||
// PreviewImageProcessorImpl always expect the extension processing format as input
|
||||
@@ -124,11 +127,15 @@ public class CameraExtensionForwardProcessor {
|
||||
@Override public void onImageAvailable(ImageReader reader) {
|
||||
Image processedImage = null;
|
||||
try {
|
||||
processedImage = mIntermediateReader.acquireNextImage();
|
||||
processedImage = reader.acquireNextImage();
|
||||
} catch (IllegalStateException e) {
|
||||
Log.e(TAG, "Failed to acquire processed image!");
|
||||
return;
|
||||
}
|
||||
if (processedImage == null) {
|
||||
Log.e(TAG, "Invalid image");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mOutputSurface != null && mOutputSurface.isValid() && !mOutputAbandoned) {
|
||||
if (mOutputWriter == null) {
|
||||
|
||||
@@ -352,7 +352,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
|
||||
try {
|
||||
mPreviewImageProcessor = new CameraExtensionForwardProcessor(
|
||||
mPreviewExtender.getPreviewImageProcessor(), repeatingSurfaceInfo.mFormat,
|
||||
repeatingSurfaceInfo.mUsage);
|
||||
repeatingSurfaceInfo.mUsage, mHandler);
|
||||
} catch (ClassCastException e) {
|
||||
throw new UnsupportedOperationException("Failed casting preview processor!");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user