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

Commit 3e42e542 authored by Dorin Drimus's avatar Dorin Drimus Committed by Android (Google) Code Review
Browse files

Merge "Add flag for virtual camera metadata APIs" into main

parents b5366422 f89129d3
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3668,10 +3668,12 @@ package android.companion.virtual.camera {
  public final class VirtualCameraConfig implements android.os.Parcelable {
    method public int describeContents();
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") @Nullable public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics();
    method public int getLensFacing();
    method @NonNull public String getName();
    method public int getSensorOrientation();
    method @NonNull public java.util.Set<android.companion.virtual.camera.VirtualCameraStreamConfig> getStreamConfigs();
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") public boolean isPerFrameCameraMetadataEnabled();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.camera.VirtualCameraConfig> CREATOR;
    field public static final int SENSOR_ORIENTATION_0 = 0; // 0x0
@@ -3684,7 +3686,9 @@ package android.companion.virtual.camera {
    ctor public VirtualCameraConfig.Builder(@NonNull String);
    method @NonNull public android.companion.virtual.camera.VirtualCameraConfig.Builder addStreamConfig(@IntRange(from=1) int, @IntRange(from=1) int, int, @IntRange(from=1) int);
    method @NonNull public android.companion.virtual.camera.VirtualCameraConfig build();
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") @NonNull public android.companion.virtual.camera.VirtualCameraConfig.Builder setCameraCharacteristics(@Nullable android.hardware.camera2.CameraCharacteristics);
    method @NonNull public android.companion.virtual.camera.VirtualCameraConfig.Builder setLensFacing(int);
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") @NonNull public android.companion.virtual.camera.VirtualCameraConfig.Builder setPerFrameCameraMetadataEnabled(boolean);
    method @NonNull public android.companion.virtual.camera.VirtualCameraConfig.Builder setSensorOrientation(int);
    method @NonNull public android.companion.virtual.camera.VirtualCameraConfig.Builder setVirtualCameraCallback(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.camera.VirtualCameraCallback);
  }
+104 −4
Original line number Diff line number Diff line
@@ -18,9 +18,11 @@ package android.companion.virtual.camera;

import static java.util.Objects.requireNonNull;

import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.companion.virtual.VirtualDevice;
@@ -29,6 +31,9 @@ import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArraySet;
@@ -87,6 +92,8 @@ public final class VirtualCameraConfig implements Parcelable {
    @SensorOrientation
    private final int mSensorOrientation;
    private final int mLensFacing;
    private final boolean mPerFrameCameraMetadataEnabled;
    private final CameraCharacteristics mCameraCharacteristics;

    private VirtualCameraConfig(
            @NonNull String name,
@@ -94,10 +101,18 @@ public final class VirtualCameraConfig implements Parcelable {
            @NonNull Executor executor,
            @NonNull VirtualCameraCallback callback,
            @SensorOrientation int sensorOrientation,
            int lensFacing) {
            int lensFacing,
            boolean perFrameCameraMetadataEnabled,
            @Nullable CameraCharacteristics cameraCharacteristics) {
        mName = requireNonNull(name, "Missing name");
        if (lensFacing == LENS_FACING_UNKNOWN) {
            throw new IllegalArgumentException("Lens facing must be set");
        if (cameraCharacteristics != null) {
            Integer characteristicsLensFacing = cameraCharacteristics.get(
                    CameraCharacteristics.LENS_FACING);
            if (characteristicsLensFacing != null && lensFacing != LENS_FACING_UNKNOWN
                    && characteristicsLensFacing != lensFacing) {
                throw new IllegalArgumentException("Different values are set for "
                        + "lensFacing and CameraCharacteristics.LENS_FACING");
            }
        }
        mLensFacing = lensFacing;
        mStreamConfigurations =
@@ -111,6 +126,8 @@ public final class VirtualCameraConfig implements Parcelable {
                        requireNonNull(callback, "Missing callback"),
                        requireNonNull(executor, "Missing callback executor"));
        mSensorOrientation = sensorOrientation;
        mPerFrameCameraMetadataEnabled = perFrameCameraMetadataEnabled;
        mCameraCharacteristics = cameraCharacteristics;
    }

    private VirtualCameraConfig(@NonNull Parcel in) {
@@ -123,6 +140,14 @@ public final class VirtualCameraConfig implements Parcelable {
                                VirtualCameraStreamConfig.class));
        mSensorOrientation = in.readInt();
        mLensFacing = in.readInt();
        mPerFrameCameraMetadataEnabled = in.readBoolean();
        final CameraMetadataNative nativeMetadata =
                in.readTypedObject(CameraMetadataNative.CREATOR);
        if (nativeMetadata != null) {
            mCameraCharacteristics = new CameraCharacteristics(nativeMetadata);
        } else {
            mCameraCharacteristics = null;
        }
    }

    @Override
@@ -138,6 +163,12 @@ public final class VirtualCameraConfig implements Parcelable {
                mStreamConfigurations.toArray(new VirtualCameraStreamConfig[0]), flags);
        dest.writeInt(mSensorOrientation);
        dest.writeInt(mLensFacing);
        dest.writeBoolean(mPerFrameCameraMetadataEnabled);
        if (mCameraCharacteristics != null) {
            dest.writeTypedObject(mCameraCharacteristics.getNativeMetadata(), flags);
        } else {
            dest.writeTypedObject(null, flags);
        }
    }

    /**
@@ -188,6 +219,27 @@ public final class VirtualCameraConfig implements Parcelable {
        return mLensFacing;
    }

    /**
     * Returns true if the virtual camera has per frame support for camera metadata.
     *
     * @see Builder#setPerFrameCameraMetadataEnabled(boolean)
     */
    @FlaggedApi(Flags.FLAG_VIRTUAL_CAMERA_METADATA)
    public boolean isPerFrameCameraMetadataEnabled() {
        return mPerFrameCameraMetadataEnabled;
    }

    /**
     * Returns the {@link CameraCharacteristics} for this virtual camera config.
     *
     * @see Builder#setCameraCharacteristics(CameraCharacteristics)
     */
    @FlaggedApi(Flags.FLAG_VIRTUAL_CAMERA_METADATA)
    @Nullable
    public CameraCharacteristics getCameraCharacteristics() {
        return mCameraCharacteristics;
    }

    /**
     * Builder for {@link VirtualCameraConfig}.
     *
@@ -205,6 +257,8 @@ public final class VirtualCameraConfig implements Parcelable {
        private VirtualCameraCallback mCallback;
        private int mSensorOrientation = SENSOR_ORIENTATION_0;
        private int mLensFacing = LENS_FACING_UNKNOWN;
        private boolean mPerFrameCameraMetadataEnabled = false;
        private CameraCharacteristics mCameraCharacteristics = null;

        /**
         * Creates a new instance of {@link Builder}.
@@ -308,6 +362,52 @@ public final class VirtualCameraConfig implements Parcelable {
            return this;
        }

        // TODO: b/371167033 - update docs and add links to
        //  onSessionConfigured, onProcessCaptureRequest, CaptureResultConsumer
        /**
         * Declares that the virtual camera owner wants to receive and provide
         * {@link CaptureRequest} and {@link CaptureResult} for every frame.
         *
         * <p>This changes what methods from the {@link VirtualCameraCallback} are called.
         * When enabled,
         * {@link VirtualCameraCallback#onProcessCaptureRequest(int, long, CaptureRequest)}
         * is called and a non null {@link CaptureResultConsumer} is received in
         * {@link VirtualCameraCallback#onSessionConfigured(SessionConfiguration, CaptureResultConsumer)}.
         * When set, the virtual camera expects the {@link CaptureResult} to be passed for each
         * frame.
         *
         * @param perFrameCameraMetadataEnabled if camera metadata is handled for each frame
         * @see onSessionConfigured
         * @see onProcessCaptureRequest
         * @see CaptureResultConsumer
         */
        @FlaggedApi(Flags.FLAG_VIRTUAL_CAMERA_METADATA)
        @NonNull
        public Builder setPerFrameCameraMetadataEnabled(boolean perFrameCameraMetadataEnabled) {
            mPerFrameCameraMetadataEnabled = perFrameCameraMetadataEnabled;
            return this;
        }

        /**
         * Sets the {@link CameraCharacteristics} to expose for the configured virtual camera.
         * This field is optional and can be omitted.
         * When set, this {@link CameraCharacteristics} becomes the source of truth and
         * {@link #setLensFacing} and {@link #setSensorOrientation} are ignored.
         * <p>
         * This also means that the corresponding key must be set in the
         * {@link CameraCharacteristics}.
         *
         * @param cameraCharacteristics The instance of the {@link CameraCharacteristics}
         *                              to be associated with the virtual camera.
         */
        @FlaggedApi(Flags.FLAG_VIRTUAL_CAMERA_METADATA)
        @NonNull
        public Builder setCameraCharacteristics(
                @Nullable CameraCharacteristics cameraCharacteristics) {
            mCameraCharacteristics = cameraCharacteristics;
            return this;
        }

        /**
         * Sets the {@link VirtualCameraCallback} used by the framework to communicate with the
         * {@link VirtualCamera} owner.
@@ -337,7 +437,7 @@ public final class VirtualCameraConfig implements Parcelable {
        public VirtualCameraConfig build() {
            return new VirtualCameraConfig(
                    mName, mStreamConfigurations, mCallbackExecutor, mCallback, mSensorOrientation,
                    mLensFacing);
                    mLensFacing, mPerFrameCameraMetadataEnabled, mCameraCharacteristics);
        }
    }

+8 −0
Original line number Diff line number Diff line
@@ -225,3 +225,11 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "virtual_camera_metadata"
    namespace: "virtual_devices"
    description: "API for enabling metadata support for virtual cameras"
    bug: "371167033"
    is_exported: true
}