From 575f3d7e47ac1256cdcfc2f517cdad9bbe3ff5e9 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Mon, 26 Oct 2020 11:47:11 -0700 Subject: [PATCH] Camera: Add CaptureResult#getCameraId() To simplify tracking of capture results from multi-camera clusters, add a method to get the camera ID that produced the capture result. Test: atest CtsCameraTestCases Bug: 171709658 Change-Id: I1109fd000ce9fbb57bb5b7ae281d0f42a5218cf7 --- api/current.txt | 1 + .../hardware/camera2/CaptureResult.java | 19 ++++++++++++++++++- .../hardware/camera2/TotalCaptureResult.java | 10 +++++----- .../camera2/impl/CameraDeviceImpl.java | 14 +++++++------- .../impl/CameraOfflineSessionImpl.java | 15 ++++++++------- non-updatable-api/current.txt | 1 + 6 files changed, 40 insertions(+), 20 deletions(-) diff --git a/api/current.txt b/api/current.txt index 4859bd9c43899..d00fbe9f23273 100644 --- a/api/current.txt +++ b/api/current.txt @@ -17864,6 +17864,7 @@ package android.hardware.camera2 { public class CaptureResult extends android.hardware.camera2.CameraMetadata> { method @Nullable public T get(android.hardware.camera2.CaptureResult.Key); + method @NonNull public String getCameraId(); method public long getFrameNumber(); method @NonNull public java.util.List> getKeys(); method @NonNull public android.hardware.camera2.CaptureRequest getRequest(); diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 8cfa0866f13a2..228617c743884 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -190,6 +190,7 @@ public class CaptureResult extends CameraMetadata> { } } + private final String mCameraId; @UnsupportedAppUsage private final CameraMetadataNative mResults; private final CaptureRequest mRequest; @@ -202,7 +203,7 @@ public class CaptureResult extends CameraMetadata> { *

For internal use only

* @hide */ - public CaptureResult(CameraMetadataNative results, CaptureRequest parent, + public CaptureResult(String cameraId, CameraMetadataNative results, CaptureRequest parent, CaptureResultExtras extras) { if (results == null) { throw new IllegalArgumentException("results was null"); @@ -221,6 +222,7 @@ public class CaptureResult extends CameraMetadata> { throw new AssertionError("Results must not be empty"); } setNativeInstance(mResults); + mCameraId = cameraId; mRequest = parent; mSequenceId = extras.getRequestId(); mFrameNumber = extras.getFrameNumber(); @@ -251,11 +253,26 @@ public class CaptureResult extends CameraMetadata> { } setNativeInstance(mResults); + mCameraId = "none"; mRequest = null; mSequenceId = sequenceId; mFrameNumber = -1; } + /** + * Get the camera ID of the camera that produced this capture result. + * + * For a logical multi-camera, the ID may be the logical or the physical camera ID, depending on + * whether the capture result was obtained from + * {@link TotalCaptureResult#getPhysicalCameraResults} or not. + * + * @return The camera ID for the camera that produced this capture result. + */ + @NonNull + public String getCameraId() { + return mCameraId; + } + /** * Get a capture result field value. * diff --git a/core/java/android/hardware/camera2/TotalCaptureResult.java b/core/java/android/hardware/camera2/TotalCaptureResult.java index 7cc2623a29baa..da65f71ce02c5 100644 --- a/core/java/android/hardware/camera2/TotalCaptureResult.java +++ b/core/java/android/hardware/camera2/TotalCaptureResult.java @@ -70,10 +70,10 @@ public final class TotalCaptureResult extends CaptureResult { * @param partials a list of partial results; {@code null} will be substituted for an empty list * @hide */ - public TotalCaptureResult(CameraMetadataNative results, CaptureRequest parent, - CaptureResultExtras extras, List partials, int sessionId, - PhysicalCaptureResultInfo physicalResults[]) { - super(results, parent, extras); + public TotalCaptureResult(String logicalCameraId, CameraMetadataNative results, + CaptureRequest parent, CaptureResultExtras extras, List partials, + int sessionId, PhysicalCaptureResultInfo[] physicalResults) { + super(logicalCameraId, results, parent, extras); if (partials == null) { mPartialResults = new ArrayList<>(); @@ -85,7 +85,7 @@ public final class TotalCaptureResult extends CaptureResult { mPhysicalCaptureResults = new HashMap(); for (PhysicalCaptureResultInfo onePhysicalResult : physicalResults) { - CaptureResult physicalResult = new CaptureResult( + CaptureResult physicalResult = new CaptureResult(onePhysicalResult.getCameraId(), onePhysicalResult.getCameraMetadata(), parent, extras); mPhysicalCaptureResults.put(onePhysicalResult.getCameraId(), physicalResult); diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 48ec3fd808fee..819d966e3bfe1 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -1980,7 +1980,7 @@ public class CameraDeviceImpl extends CameraDevice // Either send a partial result or the final capture completed result if (isPartialResult) { final CaptureResult resultAsCapture = - new CaptureResult(result, request, resultExtras); + new CaptureResult(getId(), result, request, resultExtras); // Partial result resultDispatch = new Runnable() { @Override @@ -1992,7 +1992,7 @@ public class CameraDeviceImpl extends CameraDevice for (int i = 0; i < holder.getRequestCount(); i++) { CameraMetadataNative resultLocal = new CameraMetadataNative(resultCopy); - CaptureResult resultInBatch = new CaptureResult( + CaptureResult resultInBatch = new CaptureResult(getId(), resultLocal, holder.getRequest(i), resultExtras); holder.getCallback().onCaptureProgressed( @@ -2019,8 +2019,8 @@ public class CameraDeviceImpl extends CameraDevice final Range fpsRange = request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE); final int subsequenceId = resultExtras.getSubsequenceId(); - final TotalCaptureResult resultAsCapture = new TotalCaptureResult(result, - request, resultExtras, partialResults, holder.getSessionId(), + final TotalCaptureResult resultAsCapture = new TotalCaptureResult(getId(), + result, request, resultExtras, partialResults, holder.getSessionId(), physicalResults); // Final capture result resultDispatch = new Runnable() { @@ -2038,9 +2038,9 @@ public class CameraDeviceImpl extends CameraDevice new CameraMetadataNative(resultCopy); // No logical multi-camera support for batched output mode. TotalCaptureResult resultInBatch = new TotalCaptureResult( - resultLocal, holder.getRequest(i), resultExtras, - partialResults, holder.getSessionId(), - new PhysicalCaptureResultInfo[0]); + getId(), resultLocal, holder.getRequest(i), + resultExtras, partialResults, holder.getSessionId(), + new PhysicalCaptureResultInfo[0]); holder.getCallback().onCaptureCompleted( CameraDeviceImpl.this, diff --git a/core/java/android/hardware/camera2/impl/CameraOfflineSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraOfflineSessionImpl.java index 1d8b2a123c6a9..eb2ff88ec1b22 100644 --- a/core/java/android/hardware/camera2/impl/CameraOfflineSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraOfflineSessionImpl.java @@ -334,7 +334,7 @@ public class CameraOfflineSessionImpl extends CameraOfflineSession // Either send a partial result or the final capture completed result if (isPartialResult) { final CaptureResult resultAsCapture = - new CaptureResult(result, request, resultExtras); + new CaptureResult(mCameraId, result, request, resultExtras); // Partial result resultDispatch = new Runnable() { @Override @@ -349,7 +349,8 @@ public class CameraOfflineSessionImpl extends CameraOfflineSession CameraMetadataNative resultLocal = new CameraMetadataNative(resultCopy); final CaptureResult resultInBatch = new CaptureResult( - resultLocal, holder.getRequest(i), resultExtras); + mCameraId, resultLocal, holder.getRequest(i), + resultExtras); final CaptureRequest cbRequest = holder.getRequest(i); callback.onCaptureProgressed(CameraOfflineSessionImpl.this, @@ -372,8 +373,8 @@ public class CameraOfflineSessionImpl extends CameraOfflineSession final Range fpsRange = request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE); final int subsequenceId = resultExtras.getSubsequenceId(); - final TotalCaptureResult resultAsCapture = new TotalCaptureResult(result, - request, resultExtras, partialResults, holder.getSessionId(), + final TotalCaptureResult resultAsCapture = new TotalCaptureResult(mCameraId, + result, request, resultExtras, partialResults, holder.getSessionId(), physicalResults); // Final capture result resultDispatch = new Runnable() { @@ -393,9 +394,9 @@ public class CameraOfflineSessionImpl extends CameraOfflineSession new CameraMetadataNative(resultCopy); // No logical multi-camera support for batched output mode. TotalCaptureResult resultInBatch = new TotalCaptureResult( - resultLocal, holder.getRequest(i), resultExtras, - partialResults, holder.getSessionId(), - new PhysicalCaptureResultInfo[0]); + mCameraId, resultLocal, holder.getRequest(i), + resultExtras, partialResults, holder.getSessionId(), + new PhysicalCaptureResultInfo[0]); final CaptureRequest cbRequest = holder.getRequest(i); callback.onCaptureCompleted(CameraOfflineSessionImpl.this, diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt index 5f3c01b379937..cbaad5944331c 100644 --- a/non-updatable-api/current.txt +++ b/non-updatable-api/current.txt @@ -17846,6 +17846,7 @@ package android.hardware.camera2 { public class CaptureResult extends android.hardware.camera2.CameraMetadata> { method @Nullable public T get(android.hardware.camera2.CaptureResult.Key); + method @NonNull public String getCameraId(); method public long getFrameNumber(); method @NonNull public java.util.List> getKeys(); method @NonNull public android.hardware.camera2.CaptureRequest getRequest();