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
This commit is contained in:
Eino-Ville Talvala
2020-10-26 11:47:11 -07:00
parent 92b3adcb2d
commit 575f3d7e47
6 changed files with 40 additions and 20 deletions

View File

@@ -17864,6 +17864,7 @@ package android.hardware.camera2 {
public class CaptureResult extends android.hardware.camera2.CameraMetadata<android.hardware.camera2.CaptureResult.Key<?>> {
method @Nullable public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
method @NonNull public String getCameraId();
method public long getFrameNumber();
method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
method @NonNull public android.hardware.camera2.CaptureRequest getRequest();

View File

@@ -190,6 +190,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
}
}
private final String mCameraId;
@UnsupportedAppUsage
private final CameraMetadataNative mResults;
private final CaptureRequest mRequest;
@@ -202,7 +203,7 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
* <p>For internal use only</p>
* @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<CaptureResult.Key<?>> {
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<CaptureResult.Key<?>> {
}
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.
*

View File

@@ -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<CaptureResult> partials, int sessionId,
PhysicalCaptureResultInfo physicalResults[]) {
super(results, parent, extras);
public TotalCaptureResult(String logicalCameraId, CameraMetadataNative results,
CaptureRequest parent, CaptureResultExtras extras, List<CaptureResult> 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<String, CaptureResult>();
for (PhysicalCaptureResultInfo onePhysicalResult : physicalResults) {
CaptureResult physicalResult = new CaptureResult(
CaptureResult physicalResult = new CaptureResult(onePhysicalResult.getCameraId(),
onePhysicalResult.getCameraMetadata(), parent, extras);
mPhysicalCaptureResults.put(onePhysicalResult.getCameraId(),
physicalResult);

View File

@@ -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<Integer> 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,

View File

@@ -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<Integer> 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,

View File

@@ -17846,6 +17846,7 @@ package android.hardware.camera2 {
public class CaptureResult extends android.hardware.camera2.CameraMetadata<android.hardware.camera2.CaptureResult.Key<?>> {
method @Nullable public <T> T get(android.hardware.camera2.CaptureResult.Key<T>);
method @NonNull public String getCameraId();
method public long getFrameNumber();
method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getKeys();
method @NonNull public android.hardware.camera2.CaptureRequest getRequest();