Merge "Camera: Avoid possible NPE when forwarding images" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-04-05 21:55:01 +00:00
committed by Android (Google) Code Review
2 changed files with 11 additions and 4 deletions

View File

@@ -25,6 +25,7 @@ import android.media.Image;
import android.media.ImageReader; import android.media.ImageReader;
import android.media.ImageWriter; import android.media.ImageWriter;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.os.Handler;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Log; import android.util.Log;
import android.util.Size; import android.util.Size;
@@ -39,6 +40,7 @@ public class CameraExtensionForwardProcessor {
private final IPreviewImageProcessorImpl mProcessor; private final IPreviewImageProcessorImpl mProcessor;
private final long mOutputSurfaceUsage; private final long mOutputSurfaceUsage;
private final int mOutputSurfaceFormat; private final int mOutputSurfaceFormat;
private final Handler mHandler;
private ImageReader mIntermediateReader = null; private ImageReader mIntermediateReader = null;
private Surface mIntermediateSurface = null; private Surface mIntermediateSurface = null;
@@ -48,10 +50,11 @@ public class CameraExtensionForwardProcessor {
private boolean mOutputAbandoned = false; private boolean mOutputAbandoned = false;
public CameraExtensionForwardProcessor(@NonNull IPreviewImageProcessorImpl processor, public CameraExtensionForwardProcessor(@NonNull IPreviewImageProcessorImpl processor,
int format, long surfaceUsage) { int format, long surfaceUsage, @NonNull Handler handler) {
mProcessor = processor; mProcessor = processor;
mOutputSurfaceUsage = surfaceUsage; mOutputSurfaceUsage = surfaceUsage;
mOutputSurfaceFormat = format; mOutputSurfaceFormat = format;
mHandler = handler;
} }
public void close() { public void close() {
@@ -98,7 +101,7 @@ public class CameraExtensionForwardProcessor {
mResolution.getHeight(), CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT, mResolution.getHeight(), CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT,
FORWARD_QUEUE_SIZE, mOutputSurfaceUsage); FORWARD_QUEUE_SIZE, mOutputSurfaceUsage);
mIntermediateSurface = mIntermediateReader.getSurface(); mIntermediateSurface = mIntermediateReader.getSurface();
mIntermediateReader.setOnImageAvailableListener(new ForwardCallback(), null); mIntermediateReader.setOnImageAvailableListener(new ForwardCallback(), mHandler);
mProcessor.onOutputSurface(mIntermediateSurface, mOutputSurfaceFormat); mProcessor.onOutputSurface(mIntermediateSurface, mOutputSurfaceFormat);
// PreviewImageProcessorImpl always expect the extension processing format as input // PreviewImageProcessorImpl always expect the extension processing format as input
@@ -124,11 +127,15 @@ public class CameraExtensionForwardProcessor {
@Override public void onImageAvailable(ImageReader reader) { @Override public void onImageAvailable(ImageReader reader) {
Image processedImage = null; Image processedImage = null;
try { try {
processedImage = mIntermediateReader.acquireNextImage(); processedImage = reader.acquireNextImage();
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
Log.e(TAG, "Failed to acquire processed image!"); Log.e(TAG, "Failed to acquire processed image!");
return; return;
} }
if (processedImage == null) {
Log.e(TAG, "Invalid image");
return;
}
if (mOutputSurface != null && mOutputSurface.isValid() && !mOutputAbandoned) { if (mOutputSurface != null && mOutputSurface.isValid() && !mOutputAbandoned) {
if (mOutputWriter == null) { if (mOutputWriter == null) {

View File

@@ -352,7 +352,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
try { try {
mPreviewImageProcessor = new CameraExtensionForwardProcessor( mPreviewImageProcessor = new CameraExtensionForwardProcessor(
mPreviewExtender.getPreviewImageProcessor(), repeatingSurfaceInfo.mFormat, mPreviewExtender.getPreviewImageProcessor(), repeatingSurfaceInfo.mFormat,
repeatingSurfaceInfo.mUsage); repeatingSurfaceInfo.mUsage, mHandler);
} catch (ClassCastException e) { } catch (ClassCastException e) {
throw new UnsupportedOperationException("Failed casting preview processor!"); throw new UnsupportedOperationException("Failed casting preview processor!");
} }