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

Commit 5780187f authored by Dorin Drimus's avatar Dorin Drimus
Browse files

Add onConfigureSession (base)

To the VDM IVirtualCameraCallback interface.

Bug: 371167033
Test: atest virtual_camera_tests
Test: atest VirtualCameraTest
Test: atest VirtualCameraConfigTest
Test: atest VirtualCameraCaptureTest
Test: atest VirtualCameraSessionConfigTest
Flag: android.companion.virtualdevice.flags.virtual_camera_metadata
Change-Id: I7961e634638b31ed7bef0630b9f3876a8ea09b51
parent bf27401a
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -3739,6 +3739,10 @@ package android.companion.virtual.camera {
    ctor public CameraCharacteristicsBuilder(@NonNull android.hardware.camera2.CameraCharacteristics);
    method @NonNull public android.hardware.camera2.CameraCharacteristics build();
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder set(@NonNull android.hardware.camera2.CameraCharacteristics.Key<T>, T);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCaptureRequestKeys(@Nullable java.util.List<android.hardware.camera2.CaptureRequest.Key<?>>);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCaptureResultKeys(@Nullable java.util.List<android.hardware.camera2.CaptureResult.Key<?>>);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableCharacteristicsKeys(@Nullable java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>>);
    method @NonNull public <T> android.companion.virtual.camera.CameraCharacteristicsBuilder setAvailableSessionKeys(@Nullable java.util.List<android.hardware.camera2.CaptureRequest.Key<?>>);
  }
  public final class VirtualCamera implements java.io.Closeable {
@@ -3747,10 +3751,10 @@ package android.companion.virtual.camera {
  }
  public interface VirtualCameraCallback {
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") public default void onConfigureSession(@NonNull android.companion.virtual.camera.VirtualCameraSessionConfig, @Nullable java.util.function.ObjLongConsumer<android.hardware.camera2.CaptureResult>);
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_on_open") public default void onOpenCamera();
    method public default void onProcessCaptureRequest(int, long);
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") public default void onProcessCaptureRequest(int, long, @Nullable android.hardware.camera2.CaptureRequest);
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") public default void onSessionConfigured(@NonNull android.hardware.camera2.params.SessionConfiguration, @Nullable java.util.function.ObjLongConsumer<android.hardware.camera2.CaptureResult>);
    method public void onStreamClosed(int);
    method public void onStreamConfigured(int, @NonNull android.view.Surface, @IntRange(from=1) int, @IntRange(from=1) int, int);
  }
@@ -3782,6 +3786,13 @@ package android.companion.virtual.camera {
    method @NonNull public android.companion.virtual.camera.VirtualCameraConfig.Builder setVirtualCameraCallback(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.camera.VirtualCameraCallback);
  }
  @FlaggedApi("android.companion.virtualdevice.flags.virtual_camera_metadata") public final class VirtualCameraSessionConfig implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public android.hardware.camera2.CaptureRequest getSessionParameters();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.companion.virtual.camera.VirtualCameraSessionConfig> CREATOR;
  }
  public final class VirtualCameraStreamConfig implements android.os.Parcelable {
    method public int describeContents();
    method public int getFormat();
+306 −1
Original line number Diff line number Diff line
@@ -16,16 +16,34 @@

package android.companion.virtual.camera;

import static android.companion.virtual.camera.VirtualCameraConfig.SENSOR_ORIENTATION_0;
import static android.graphics.ImageFormat.YUV_420_888;
import static android.hardware.camera2.CameraMetadata.LENS_FACING_FRONT;

import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.graphics.Rect;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.params.SessionConfiguration;
import android.hardware.camera2.params.StreamConfiguration;
import android.hardware.camera2.params.StreamConfigurationDuration;
import android.util.Range;
import android.util.Rational;
import android.util.Size;
import android.util.SizeF;

import java.util.List;

/**
 * Builder class for creating {@link CameraCharacteristics} instances to be used in a
 * {@link VirtualCameraConfig}.
 *
 * @hide
 */
// There is no CameraCharacteristics.Builder for now, so this helps VDM clients to build
@@ -37,15 +55,29 @@ public final class CameraCharacteristicsBuilder {
    private final CameraMetadataNative mNativeMetadata;

    /**
     * Builder for creating {@link CameraCharacteristics} starting from an empty list of keys.
     * Builder for creating {@link CameraCharacteristics} starting from a preset list of
     * {@link CameraCharacteristics.Key}s and values necessary to create a complete and valid
     * {@link CameraCharacteristics} instance. Once built, the {@link CameraCharacteristics}
     * cover the mandatory keys from the
     * <a href="https://android.googlesource.com/platform/hardware/libhardware/+/refs/heads/main/include_all/hardware/camera3.h">Camera HAL specification</a>.
     * and can be used to create a functional {@link VirtualCamera} that can be queried and opened
     * by camera apps.
     * <p>
     * The filled in keys and values are opinionated and can be further overwritten with the
     * desired values.
     */
    public CameraCharacteristicsBuilder() {
        mNativeMetadata = new CameraMetadataNative();
        setDefaults();
    }

    /**
     * Builder for creating {@link CameraCharacteristics} starting from a copy of
     * the passed characteristics.
     * <p>
     * It doesn't add any default keys, so it's the responsibility of the caller to add all the
     * mandatory {@link CameraCharacteristics.Key}s required by the Camera HAL for instantiating
     * and opening the camera.
     */
    public CameraCharacteristicsBuilder(@NonNull CameraCharacteristics characteristics) {
        mNativeMetadata = new CameraMetadataNative(characteristics.getNativeMetadata());
@@ -71,6 +103,83 @@ public final class CameraCharacteristicsBuilder {
        return this;
    }

    /**
     * Sets the {@link CameraCharacteristics.Key}s available for the {@link CameraCharacteristics}.
     * Any key not listed here won't be queryable by the application using the camera.
     */
    @SuppressLint("MissingGetterMatchingBuilder") // the getter method is getKeys()
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableCharacteristicsKeys(
            @Nullable List<CameraCharacteristics.Key<?>> availableCharacteristicsKeys) {
        int[] characteristicsTags = null;
        if (availableCharacteristicsKeys != null) {
            characteristicsTags = new int[availableCharacteristicsKeys.size()];
            for (int i = 0; i < availableCharacteristicsKeys.size(); i++) {
                characteristicsTags[i] =
                        availableCharacteristicsKeys.get(i).getNativeKey().getTag();
            }
        }
        mNativeMetadata.set(CameraCharacteristics.REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
                characteristicsTags);

        return this;
    }

    /**
     * Sets the {@link CaptureRequest.Key}s available for the {@link CaptureRequest}.
     */
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableCaptureRequestKeys(
            @Nullable List<CaptureRequest.Key<?>> availableCaptureRequestKeys) {
        int[] captureRequestTags = null;
        if (availableCaptureRequestKeys != null) {
            captureRequestTags = new int[availableCaptureRequestKeys.size()];
            for (int i = 0; i < availableCaptureRequestKeys.size(); i++) {
                captureRequestTags[i] = availableCaptureRequestKeys.get(i).getNativeKey().getTag();
            }
        }
        mNativeMetadata.set(CameraCharacteristics.REQUEST_AVAILABLE_REQUEST_KEYS,
                captureRequestTags);

        return this;
    }

    /**
     * Sets the {@link CaptureResult.Key}s available for the {@link CaptureResult}.
     */
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableCaptureResultKeys(
            @Nullable List<CaptureResult.Key<?>> availableCaptureResultKeys) {
        int[] captureResultTags = null;
        if (availableCaptureResultKeys != null) {
            captureResultTags = new int[availableCaptureResultKeys.size()];
            for (int i = 0; i < availableCaptureResultKeys.size(); i++) {
                captureResultTags[i] = availableCaptureResultKeys.get(i).getNativeKey().getTag();
            }
        }
        mNativeMetadata.set(CameraCharacteristics.REQUEST_AVAILABLE_RESULT_KEYS, captureResultTags);

        return this;
    }

    /**
     * Sets the {@link CaptureRequest.Key}s available for the {@link SessionConfiguration}.
     */
    @NonNull
    public <T> CameraCharacteristicsBuilder setAvailableSessionKeys(
            @Nullable List<CaptureRequest.Key<?>> availableSessionKeys) {
        int[] sessionTags = null;
        if (availableSessionKeys != null) {
            sessionTags = new int[availableSessionKeys.size()];
            for (int i = 0; i < availableSessionKeys.size(); i++) {
                sessionTags[i] = availableSessionKeys.get(i).getNativeKey().getTag();
            }
        }
        mNativeMetadata.set(CameraCharacteristics.REQUEST_AVAILABLE_SESSION_KEYS, sessionTags);

        return this;
    }

    /**
     * Builds the {@link CameraCharacteristics} object with the set
     * {@link CameraCharacteristics.Key}s.
@@ -81,4 +190,200 @@ public final class CameraCharacteristicsBuilder {
    public @NonNull CameraCharacteristics build() {
        return new CameraCharacteristics(mNativeMetadata);
    }

    // set the default keys and values necessary for a valid and usable CameraCharacteristics
    private void setDefaults() {
        List<CameraCharacteristics.Key<?>> availableCharacteristicsKeys = List.of(
                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL,
                CameraCharacteristics.FLASH_INFO_AVAILABLE, CameraCharacteristics.LENS_FACING,
                CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
                CameraCharacteristics.SENSOR_ORIENTATION,
                CameraCharacteristics.SENSOR_READOUT_TIMESTAMP,
                CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE,
                CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE,
                CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
                CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
                CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
                CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES,
                CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES,
                CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
                CameraCharacteristics.CONTROL_AVAILABLE_MODES,
                CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES,
                CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES,
                CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS,
                CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
                CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES,
                CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
                CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
                CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE,
                CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP,
                CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE,
                CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE,
                CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES,
                CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE,
                CameraCharacteristics.SCALER_CROPPING_TYPE,
                CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES,
                CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT,
                CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION,
                CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT,
                CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH,
                CameraCharacteristics.SYNC_MAX_LATENCY,
                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES,
                CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE,
                CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE);

        List<CaptureRequest.Key<?>> availableCaptureRequestKeys = List.of(
                CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE,
                CaptureRequest.CONTROL_CAPTURE_INTENT,
                CaptureRequest.CONTROL_AE_MODE,
                CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,
                CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
                CaptureRequest.CONTROL_AE_ANTIBANDING_MODE,
                CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
                CaptureRequest.CONTROL_AF_TRIGGER,
                CaptureRequest.CONTROL_AF_MODE,
                CaptureRequest.CONTROL_AWB_MODE,
                CaptureRequest.SCALER_CROP_REGION,
                CaptureRequest.CONTROL_EFFECT_MODE,
                CaptureRequest.CONTROL_MODE,
                CaptureRequest.CONTROL_SCENE_MODE,
                CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
                CaptureRequest.CONTROL_ZOOM_RATIO,
                CaptureRequest.FLASH_MODE,
                CaptureRequest.JPEG_THUMBNAIL_SIZE,
                CaptureRequest.JPEG_ORIENTATION,
                CaptureRequest.JPEG_QUALITY,
                CaptureRequest.JPEG_THUMBNAIL_QUALITY,
                CaptureRequest.JPEG_THUMBNAIL_SIZE,
                CaptureRequest.NOISE_REDUCTION_MODE,
                CaptureRequest.STATISTICS_FACE_DETECT_MODE);

        List<CaptureResult.Key<?>> availableCaptureResultKeys = List.of(
                CaptureResult.COLOR_CORRECTION_ABERRATION_MODE,
                CaptureResult.CONTROL_AE_ANTIBANDING_MODE,
                CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION,
                CaptureResult.CONTROL_AE_LOCK,
                CaptureResult.CONTROL_AE_MODE,
                CaptureResult.CONTROL_AE_PRECAPTURE_TRIGGER,
                CaptureResult.CONTROL_AE_STATE,
                CaptureResult.CONTROL_AE_TARGET_FPS_RANGE,
                CaptureResult.CONTROL_AF_MODE,
                CaptureResult.CONTROL_AF_STATE,
                CaptureResult.CONTROL_AF_TRIGGER,
                CaptureResult.CONTROL_AWB_LOCK,
                CaptureResult.CONTROL_AWB_MODE,
                CaptureResult.CONTROL_AWB_STATE,
                CaptureResult.CONTROL_CAPTURE_INTENT,
                CaptureResult.CONTROL_EFFECT_MODE,
                CaptureResult.CONTROL_MODE,
                CaptureResult.CONTROL_SCENE_MODE,
                CaptureResult.CONTROL_VIDEO_STABILIZATION_MODE,
                CaptureResult.STATISTICS_FACE_DETECT_MODE,
                CaptureResult.FLASH_MODE,
                CaptureResult.FLASH_STATE,
                CaptureResult.JPEG_THUMBNAIL_SIZE,
                CaptureResult.JPEG_QUALITY,
                CaptureResult.JPEG_THUMBNAIL_QUALITY,
                CaptureResult.LENS_FOCAL_LENGTH,
                CaptureResult.LENS_OPTICAL_STABILIZATION_MODE,
                CaptureResult.NOISE_REDUCTION_MODE,
                CaptureResult.REQUEST_PIPELINE_DEPTH,
                CaptureResult.SENSOR_TIMESTAMP,
                CaptureResult.STATISTICS_HOT_PIXEL_MAP_MODE,
                CaptureResult.STATISTICS_LENS_SHADING_MAP_MODE,
                CaptureResult.STATISTICS_SCENE_FLICKER);

        int cameraWidth = 640;
        int cameraHeight = 480;
        int minFps = 4;
        int maxFps = 30;
        int streamFormat = YUV_420_888;
        long minFrameDuration = 1_000_000_000L / maxFps;
        long minStallDuration = 0L;

        Size supportedSize = new Size(cameraWidth, cameraHeight);
        Range<Integer>[] supportedFpsRange = new Range[]{new Range<>(minFps, maxFps)};

        StreamConfiguration streamConfig = new StreamConfiguration(streamFormat, cameraWidth,
                cameraHeight, false);
        StreamConfigurationDuration streamMinFrameConfig = new StreamConfigurationDuration(
                streamFormat, cameraWidth, cameraHeight, minFrameDuration);
        StreamConfigurationDuration streamStallConfig = new StreamConfigurationDuration(
                streamFormat, cameraWidth, cameraHeight, minStallDuration);

        set(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL,
                CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL);
        set(CameraCharacteristics.FLASH_INFO_AVAILABLE, false);
        set(CameraCharacteristics.LENS_FACING, LENS_FACING_FRONT);
        set(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS, new float[]{43.0f});
        set(CameraCharacteristics.SENSOR_ORIENTATION, SENSOR_ORIENTATION_0);
        set(CameraCharacteristics.SENSOR_READOUT_TIMESTAMP,
                CameraCharacteristics.SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED);
        set(CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE,
                CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN);
        set(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE, new SizeF(36.0f, 24.0f));
        set(CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
                new int[]{CameraCharacteristics.COLOR_CORRECTION_ABERRATION_MODE_OFF});
        set(CameraCharacteristics.NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
                new int[]{CameraCharacteristics.NOISE_REDUCTION_MODE_OFF});
        set(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
                new int[]{CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_OFF});
        set(CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES,
                new long[]{CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT,
                        CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW,
                        CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE,
                        CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD,
                        CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL,
                        CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL});
        set(CameraCharacteristics.SENSOR_AVAILABLE_TEST_PATTERN_MODES,
                new int[]{CameraCharacteristics.SENSOR_TEST_PATTERN_MODE_OFF});
        set(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 1.0f);
        set(CameraCharacteristics.CONTROL_AVAILABLE_MODES,
                new int[]{CameraCharacteristics.CONTROL_MODE_AUTO});
        set(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES,
                new int[]{CameraCharacteristics.CONTROL_AF_MODE_OFF});
        set(CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES,
                new int[]{CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED});
        set(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS,
                new int[]{CameraCharacteristics.CONTROL_EFFECT_MODE_OFF});
        set(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
                new int[]{CameraCharacteristics.CONTROL_VIDEO_STABILIZATION_MODE_OFF});
        set(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES,
                new int[]{CameraCharacteristics.CONTROL_AE_MODE_ON});
        set(CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
                new int[]{CameraCharacteristics.CONTROL_AE_ANTIBANDING_MODE_AUTO});
        set(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, supportedFpsRange);
        set(CameraCharacteristics.CONTROL_MAX_REGIONS, new int[]{0, 0, 0});
        set(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE, new Range<>(0, 0));
        set(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP, new Rational(0, 0));
        set(CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE, false);
        set(CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE, false);
        set(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES,
                new int[]{CameraCharacteristics.CONTROL_AWB_MODE_AUTO});
        set(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE, new Range<>(1.0f, 1.0f));
        set(CameraCharacteristics.SCALER_CROPPING_TYPE,
                CameraCharacteristics.SCALER_CROPPING_TYPE_CENTER_ONLY);
        set(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES, new Size[]{supportedSize});
        set(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT, 0);
        set(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION, 1_000_000_000L);
        set(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS, new int[]{0, 3, 1});
        set(CameraCharacteristics.REQUEST_PARTIAL_RESULT_COUNT, 1);
        set(CameraCharacteristics.REQUEST_PIPELINE_MAX_DEPTH, (byte) 2);
        set(CameraCharacteristics.SYNC_MAX_LATENCY, CameraCharacteristics.SYNC_MAX_LATENCY_UNKNOWN);
        set(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES, new int[]{
                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE});
        set(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE,
                new Rect(0, 0, cameraWidth, cameraHeight));
        set(CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE, supportedSize);
        // stream configurations
        set(CameraCharacteristics.SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
                new StreamConfiguration[]{streamConfig});
        set(CameraCharacteristics.SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
                new StreamConfigurationDuration[]{streamMinFrameConfig});
        set(CameraCharacteristics.SCALER_AVAILABLE_STALL_DURATIONS,
                new StreamConfigurationDuration[]{streamStallConfig});
        setAvailableCharacteristicsKeys(availableCharacteristicsKeys);
        setAvailableCaptureRequestKeys(availableCaptureRequestKeys);
        setAvailableCaptureResultKeys(availableCaptureResultKeys);
    }
}
+32 −0
Original line number Diff line number Diff line
/*
 * Copyright 2025 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.companion.virtual.camera;

import android.hardware.camera2.impl.CameraMetadataNative;

/**
 * AIDL Interface to inject capture results metadata to the virtual camera server.
 * @hide
 */
oneway interface ICaptureResultConsumer {

    /**
     * Injects the CameraMetadataNative part of the CaptureResult to be sent for the timestamp
     * on all streams for the associated session.
     */
    void sendCaptureResult(long timestamp, in CameraMetadataNative captureResult);
}
 No newline at end of file
+17 −0
Original line number Diff line number Diff line
@@ -15,7 +15,10 @@
 */

package android.companion.virtual.camera;

import android.companion.virtual.camera.ICaptureResultConsumer;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.SessionConfiguration;
import android.view.Surface;

/**
@@ -40,6 +43,20 @@ oneway interface IVirtualCameraCallback {
     */
    void onOpenCamera();

    /**
     * Called when there's a new camera session. This callback is sent when clients open and
     * configure the video session for the virtual camera.
     *
     * @param sessionParameters The {@link CaptureRequest} session parameters from the
     *      {@link SessionConfiguration} requested by the app using the virtual camera.
     *      The available Keys need to be set in the ANDROID_REQUEST_AVAILABLE_SESSION_KEYS tag of
     *      the {@link CameraCharacteristics}.
     * @param captureResultConsumer The consumer interface through which the virtual camera server
     *      consumes the CameraMetadataNative part of the CaptureResult.
     */
    void onConfigureSession(in CaptureRequest sessionParameters,
        in ICaptureResultConsumer captureResultConsumer);

    /**
     * Called when one of the requested stream has been configured by the virtual camera service and
     * is ready to receive data onto its {@link Surface}
+11 −10

File changed.

Preview size limit exceeded, changes collapsed.

Loading