diff options
Diffstat (limited to 'core/java/android')
5 files changed, 149 insertions, 13 deletions
diff --git a/core/java/android/hardware/camera2/TotalCaptureResult.java b/core/java/android/hardware/camera2/TotalCaptureResult.java index 657745c80e91..bae2d04b0a24 100644 --- a/core/java/android/hardware/camera2/TotalCaptureResult.java +++ b/core/java/android/hardware/camera2/TotalCaptureResult.java @@ -17,11 +17,14 @@ package android.hardware.camera2; import android.annotation.NonNull; +import android.annotation.Nullable; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.impl.CaptureResultExtras; +import android.hardware.camera2.impl.PhysicalCaptureResultInfo; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; /** @@ -44,6 +47,12 @@ import java.util.List; * as {@link CaptureRequest#STATISTICS_FACE_DETECT_MODE}). Refer to each key documentation on * a case-by-case basis.</p> * + * <p>For a logical multi-camera device, if the CaptureRequest contains a surface for an underlying + * physical camera, the corresponding {@link TotalCaptureResult} object will include the metadata + * for that physical camera. And its keys and values can be accessed by + * {@link #getPhysicalCameraKey}. If all requested surfaces are for the logical camera, no + * metadata for physical camera will be included.</p> + * * <p>{@link TotalCaptureResult} objects are immutable.</p> * * @see CameraDevice.CaptureCallback#onCaptureCompleted @@ -52,6 +61,8 @@ public final class TotalCaptureResult extends CaptureResult { private final List<CaptureResult> mPartialResults; private final int mSessionId; + // The map between physical camera id and capture result + private final HashMap<String, CameraMetadataNative> mPhysicalCaptureResults; /** * Takes ownership of the passed-in camera metadata and the partial results @@ -60,7 +71,8 @@ public final class TotalCaptureResult extends CaptureResult { * @hide */ public TotalCaptureResult(CameraMetadataNative results, CaptureRequest parent, - CaptureResultExtras extras, List<CaptureResult> partials, int sessionId) { + CaptureResultExtras extras, List<CaptureResult> partials, int sessionId, + PhysicalCaptureResultInfo physicalResults[]) { super(results, parent, extras); if (partials == null) { @@ -70,6 +82,12 @@ public final class TotalCaptureResult extends CaptureResult { } mSessionId = sessionId; + + mPhysicalCaptureResults = new HashMap<String, CameraMetadataNative>(); + for (PhysicalCaptureResultInfo onePhysicalResult : physicalResults) { + mPhysicalCaptureResults.put(onePhysicalResult.getCameraId(), + onePhysicalResult.getCameraMetadata()); + } } /** @@ -83,6 +101,7 @@ public final class TotalCaptureResult extends CaptureResult { mPartialResults = new ArrayList<>(); mSessionId = CameraCaptureSession.SESSION_ID_NONE; + mPhysicalCaptureResults = new HashMap<String, CameraMetadataNative>(); } /** @@ -111,4 +130,38 @@ public final class TotalCaptureResult extends CaptureResult { public int getSessionId() { return mSessionId; } + + /** + * Get a capture result field value for a particular physical camera id. + * + * <p>The field definitions can be found in {@link CaptureResult}.</p> + * + * <p>This function can be called for logical camera devices, which are devices that have + * REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA capability and calls to {@link + * CameraCharacteristics#getPhysicalCameraIds} return a non-empty list of physical devices that + * are backing the logical camera. The camera id included in physicalCameraId argument + * selects an individual physical device, and returns its specific capture result field.</p> + * + * <p>This function should only be called if one or more streams from the underlying + * 'physicalCameraId' was requested by the corresponding capture request.</p> + * + * @throws IllegalArgumentException if the key was not valid, or the physicalCameraId is not + * applicable to the current camera, or a stream from 'physicalCameraId' is not requested by the + * corresponding capture request. + * + * @param key The result field to read. + * @param physicalCameraId The physical camera the result originates from. + * + * @return The value of that key, or {@code null} if the field is not set. + */ + @Nullable + public <T> T getPhysicalCameraKey(Key<T> key, @NonNull String physicalCameraId) { + if (!mPhysicalCaptureResults.containsKey(physicalCameraId)) { + throw new IllegalArgumentException( + "No TotalCaptureResult exists for physical camera " + physicalCameraId); + } + + CameraMetadataNative physicalMetadata = mPhysicalCaptureResults.get(physicalCameraId); + return physicalMetadata.get(key); + } } diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index cab9d7046fcd..511fa43a5441 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -1001,19 +1001,17 @@ public class CameraDeviceImpl extends CameraDevice throw new IllegalArgumentException("Null Surface targets are not allowed"); } - if (!request.isReprocess()) { - continue; - } for (int i = 0; i < mConfiguredOutputs.size(); i++) { OutputConfiguration configuration = mConfiguredOutputs.valueAt(i); if (configuration.isForPhysicalCamera() && configuration.getSurfaces().contains(surface)) { - throw new IllegalArgumentException( - "Reprocess request on physical stream is not allowed"); + if (request.isReprocess()) { + throw new IllegalArgumentException( + "Reprocess request on physical stream is not allowed"); + } } } } - } synchronized(mInterfaceLock) { @@ -1966,7 +1964,8 @@ public class CameraDeviceImpl extends CameraDevice @Override public void onResultReceived(CameraMetadataNative result, - CaptureResultExtras resultExtras) throws RemoteException { + CaptureResultExtras resultExtras, PhysicalCaptureResultInfo physicalResults[]) + throws RemoteException { int requestId = resultExtras.getRequestId(); long frameNumber = resultExtras.getFrameNumber(); @@ -2073,7 +2072,8 @@ public class CameraDeviceImpl extends CameraDevice request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE); final int subsequenceId = resultExtras.getSubsequenceId(); final TotalCaptureResult resultAsCapture = new TotalCaptureResult(result, - request, resultExtras, partialResults, holder.getSessionId()); + request, resultExtras, partialResults, holder.getSessionId(), + physicalResults); // Final capture result resultDispatch = new Runnable() { @Override @@ -2088,9 +2088,11 @@ public class CameraDeviceImpl extends CameraDevice NANO_PER_SECOND/fpsRange.getUpper()); CameraMetadataNative resultLocal = new CameraMetadataNative(resultCopy); + // No logical multi-camera support for batched output mode. TotalCaptureResult resultInBatch = new TotalCaptureResult( resultLocal, holder.getRequest(i), resultExtras, - partialResults, holder.getSessionId()); + partialResults, holder.getSessionId(), + new PhysicalCaptureResultInfo[0]); holder.getCallback().onCaptureCompleted( CameraDeviceImpl.this, diff --git a/core/java/android/hardware/camera2/impl/PhysicalCaptureResultInfo.java b/core/java/android/hardware/camera2/impl/PhysicalCaptureResultInfo.java new file mode 100644 index 000000000000..30eaf1373c89 --- /dev/null +++ b/core/java/android/hardware/camera2/impl/PhysicalCaptureResultInfo.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.hardware.camera2.impl; + +import android.hardware.camera2.impl.CameraMetadataNative; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * @hide + */ +public class PhysicalCaptureResultInfo implements Parcelable { + private String cameraId; + private CameraMetadataNative cameraMetadata; + + public static final Parcelable.Creator<PhysicalCaptureResultInfo> CREATOR = + new Parcelable.Creator<PhysicalCaptureResultInfo>() { + @Override + public PhysicalCaptureResultInfo createFromParcel(Parcel in) { + return new PhysicalCaptureResultInfo(in); + } + + @Override + public PhysicalCaptureResultInfo[] newArray(int size) { + return new PhysicalCaptureResultInfo[size]; + } + }; + + private PhysicalCaptureResultInfo(Parcel in) { + readFromParcel(in); + } + + public PhysicalCaptureResultInfo(String cameraId, CameraMetadataNative cameraMetadata) { + this.cameraId = cameraId; + this.cameraMetadata = cameraMetadata; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(cameraId); + cameraMetadata.writeToParcel(dest, flags); + } + + public void readFromParcel(Parcel in) { + cameraId = in.readString(); + cameraMetadata = new CameraMetadataNative(); + cameraMetadata.readFromParcel(in); + } + + public String getCameraId() { + return cameraId; + } + + public CameraMetadataNative getCameraMetadata() { + return cameraMetadata; + } +} diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java index eccab7500abf..bc7b1260751e 100644 --- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java +++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java @@ -26,6 +26,7 @@ import android.hardware.camera2.ICameraDeviceCallbacks; import android.hardware.camera2.ICameraDeviceUser; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.impl.CaptureResultExtras; +import android.hardware.camera2.impl.PhysicalCaptureResultInfo; import android.hardware.camera2.params.OutputConfiguration; import android.hardware.camera2.utils.SubmitInfo; import android.os.ConditionVariable; @@ -249,7 +250,8 @@ public class CameraDeviceUserShim implements ICameraDeviceUser { @Override public void onResultReceived(final CameraMetadataNative result, - final CaptureResultExtras resultExtras) { + final CaptureResultExtras resultExtras, + PhysicalCaptureResultInfo physicalResults[]) { Object[] resultArray = new Object[] { result, resultExtras }; Message msg = getHandler().obtainMessage(RESULT_RECEIVED, /*obj*/ resultArray); @@ -320,7 +322,8 @@ public class CameraDeviceUserShim implements ICameraDeviceUser { Object[] resultArray = (Object[]) msg.obj; CameraMetadataNative result = (CameraMetadataNative) resultArray[0]; CaptureResultExtras resultExtras = (CaptureResultExtras) resultArray[1]; - mCallbacks.onResultReceived(result, resultExtras); + mCallbacks.onResultReceived(result, resultExtras, + new PhysicalCaptureResultInfo[0]); break; } case PREPARED: { diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java index cb59fd14f5c5..e7f2134de0ee 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java +++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java @@ -23,6 +23,7 @@ import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.impl.CameraDeviceImpl; import android.hardware.camera2.impl.CaptureResultExtras; +import android.hardware.camera2.impl.PhysicalCaptureResultInfo; import android.hardware.camera2.ICameraDeviceCallbacks; import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.camera2.utils.ArrayUtils; @@ -253,7 +254,8 @@ public class LegacyCameraDevice implements AutoCloseable { holder.getRequestId()); } try { - mDeviceCallbacks.onResultReceived(result, extras); + mDeviceCallbacks.onResultReceived(result, extras, + new PhysicalCaptureResultInfo[0]); } catch (RemoteException e) { throw new IllegalStateException( "Received remote exception during onCameraError callback: ", e); |
