Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 707d5e5a authored by Emilian Peev's avatar Emilian Peev
Browse files

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
parent bb12e225
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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!");
            }