diff --git a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java
index cca900a08d8d0..1bf004a2aeb0f 100644
--- a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java
@@ -541,7 +541,8 @@ public final class CameraExtensionCharacteristics {
private static boolean isOutputSupportedFor(Class klass) {
Objects.requireNonNull(klass, "klass must not be null");
- if (klass == android.graphics.SurfaceTexture.class) {
+ if ((klass == android.graphics.SurfaceTexture.class) ||
+ (klass == android.view.SurfaceView.class)) {
return true;
}
@@ -725,6 +726,12 @@ public final class CameraExtensionCharacteristics {
* backward compatible cameras whereas other output classes are not guaranteed to be supported.
*
*
+ * Starting with Android {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE}
+ * {@link android.view.SurfaceView} classes are also guaranteed to be supported and include
+ * the same resolutions as {@link android.graphics.SurfaceTexture}.
+ * Clients must set the desired SurfaceView resolution by calling
+ * {@link android.view.SurfaceHolder#setFixedSize}.
+ *
* @param extension the extension type
* @param klass a non-{@code null} {@link Class} object reference
* @return non-modifiable list of available sizes or an empty list if the Surface output is not
diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
index 41c406dc16417..db83e6218daf2 100644
--- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java
@@ -62,8 +62,6 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.RemoteException;
import android.util.Log;
-import android.util.Pair;
-import android.util.Range;
import android.util.Size;
import android.view.Surface;
@@ -270,6 +268,10 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
}
}
+ // The extension processing logic needs to be able to match images to capture results via
+ // image and result timestamps.
+ cameraOutput.setTimestampBase(OutputConfiguration.TIMESTAMP_BASE_SENSOR);
+ cameraOutput.setReadoutTimestampEnabled(false);
cameraOutput.setPhysicalCameraId(output.physicalCameraId);
outputList.add(cameraOutput);
mCameraConfigMap.put(cameraOutput.getSurface(), output);
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
index 3f85d44b3b538..c2b36560919b2 100644
--- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java
@@ -60,7 +60,6 @@ import android.os.RemoteException;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.Pair;
-import android.util.Range;
import android.util.Size;
import android.view.Surface;
@@ -478,13 +477,21 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
ArrayList sessionParamsList = new ArrayList<>();
ArrayList outputList = new ArrayList<>();
initializeRepeatingRequestPipeline();
- outputList.add(new OutputConfiguration(mCameraRepeatingSurface));
+ OutputConfiguration previewOutput = new OutputConfiguration(mCameraRepeatingSurface);
+ // The extension processing logic needs to be able to match images to capture results via
+ // image and result timestamps.
+ previewOutput.setTimestampBase(OutputConfiguration.TIMESTAMP_BASE_SENSOR);
+ previewOutput.setReadoutTimestampEnabled(false);
+ outputList.add(previewOutput);
CaptureStageImpl previewSessionParams = mPreviewExtender.onPresetSession();
if (previewSessionParams != null) {
sessionParamsList.add(previewSessionParams);
}
initializeBurstCapturePipeline();
- outputList.add(new OutputConfiguration(mCameraBurstSurface));
+ OutputConfiguration captureOutput = new OutputConfiguration(mCameraBurstSurface);
+ captureOutput.setTimestampBase(OutputConfiguration.TIMESTAMP_BASE_SENSOR);
+ captureOutput.setReadoutTimestampEnabled(false);
+ outputList.add(captureOutput);
CaptureStageImpl stillCaptureSessionParams = mImageExtender.onPresetSession();
if (stillCaptureSessionParams != null) {
sessionParamsList.add(stillCaptureSessionParams);
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java b/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java
index 52224084bc0a5..08111c5f38745 100644
--- a/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java
+++ b/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java
@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
+import android.hardware.HardwareBuffer;
import android.hardware.camera2.CameraExtensionCharacteristics;
import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap;
@@ -149,6 +150,7 @@ public final class CameraExtensionUtils {
SurfaceInfo surfaceInfo = querySurface(config.getSurface());
if ((surfaceInfo.mFormat ==
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT) ||
+ ((surfaceInfo.mUsage & HardwareBuffer.USAGE_COMPOSER_OVERLAY) != 0) ||
// The default RGBA_8888 is also implicitly supported because camera will
// internally override it to
// 'CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT'