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

Commit 5d0a104b authored by Bharatt Kukreja's avatar Bharatt Kukreja Committed by Android (Google) Code Review
Browse files

Merge "Camera: Add getSessionCharacteristics API" into main

parents 219e0992 71f33eae
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -18787,6 +18787,7 @@ package android.hardware.camera2 {
    method @NonNull public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
    method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
    method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailablePhysicalCameraRequestKeys();
    method @FlaggedApi("com.android.internal.camera.flags.feature_combination_query") @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getAvailableSessionCharacteristicsKeys();
    method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableSessionKeys();
    method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
    method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission();
@@ -18939,6 +18940,7 @@ package android.hardware.camera2 {
    method @Deprecated public abstract void createReprocessableCaptureSessionByConfigurations(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
    method public int getCameraAudioRestriction() throws android.hardware.camera2.CameraAccessException;
    method @NonNull public abstract String getId();
    method @FlaggedApi("com.android.internal.camera.flags.feature_combination_query") @NonNull public android.hardware.camera2.CameraCharacteristics getSessionCharacteristics(@NonNull android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
    method @Deprecated public boolean isSessionConfigurationSupported(@NonNull android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
    method public void setCameraAudioRestriction(int) throws android.hardware.camera2.CameraAccessException;
    field public static final int AUDIO_RESTRICTION_NONE = 0; // 0x0
+23 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.camera.flags.Flags;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -206,6 +207,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
    private List<CameraCharacteristics.Key<?>> mKeysNeedingPermission;
    private List<CaptureRequest.Key<?>> mAvailableRequestKeys;
    private List<CaptureRequest.Key<?>> mAvailableSessionKeys;
    private List<CameraCharacteristics.Key<?>> mAvailableSessionCharacteristicsKeys;
    private List<CaptureRequest.Key<?>> mAvailablePhysicalRequestKeys;
    private List<CaptureResult.Key<?>> mAvailableResultKeys;
    private ArrayList<RecommendedStreamConfigurationMap> mRecommendedConfigurations;
@@ -545,6 +547,27 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
        return mAvailableSessionKeys;
    }

    /**
     * <p>Get the keys in Camera Characteristics whose values are capture session specific.
     * The session specific characteristics can be acquired by calling
     * CameraDevice.getSessionCharacteristics(). </p>
     *
     * <p>Note that getAvailableSessionKeys returns the CaptureRequest keys that are difficult to
     * apply per-frame, whereas this function returns CameraCharacteristics keys that are dependent
     * on a particular SessionConfiguration.</p>
     *
     * @return List of CameraCharacteristic keys containing characterisitics specific to a session
     * configuration. For Android 15, this list only contains CONTROL_ZOOM_RATIO_RANGE.
     */
    @NonNull
    @FlaggedApi(Flags.FLAG_FEATURE_COMBINATION_QUERY)
    public List<CameraCharacteristics.Key<?>> getAvailableSessionCharacteristicsKeys() {
        if (mAvailableSessionCharacteristicsKeys == null) {
            mAvailableSessionCharacteristicsKeys = Arrays.asList(CONTROL_ZOOM_RATIO_RANGE);
        }
        return mAvailableSessionCharacteristicsKeys;
    }

    /**
     * <p>Returns a subset of {@link #getAvailableCaptureRequestKeys} keys that can
     * be overridden for physical devices backing a logical multi-camera.</p>
+32 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.hardware.camera2;

import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -28,6 +29,8 @@ import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Handler;
import android.view.Surface;

import com.android.internal.camera.flags.Flags;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
@@ -1412,6 +1415,34 @@ public abstract class CameraDevice implements AutoCloseable {
        throw new UnsupportedOperationException("Subclasses must override this method");
    }

  /**
   * <p>Get camera characteristics for a particular session configuration by the camera device.</p>
   *
   * <p>The camera characteristics returned here is typically more limited than the characteristics
   * returned from {@link CameraManager#getCameraCharacteristics}. The keys that have more limited
   * values are listed in
   * {@link CameraCharacteristics#getAvailableSessionCharacteristicsKeys}. </p>
   *
   * <p>Other than that, the characteristics returned here can be used in the same way as those
   * returned from {@link CameraManager#getCameraCharacteristics}.</p>
   *
   * @param sessionConfig : The session configuration for which characteristics are fetched.
   * @return CameraCharacteristics specific to a given session configuration.
   * @throws UnsupportedOperationException if the query operation is not supported by the camera
   *                                       device
   * @throws IllegalArgumentException if the session configuration is invalid
   * @throws CameraAccessException if the camera device is no longer connected or has
   *                               encountered a fatal error
   * @throws IllegalStateException if the camera device has been closed
   * @see android.hardware.camera2.CameraCharacteristics#getAvailableSessionCharacteristicsKeys
   */
    @NonNull
    @FlaggedApi(Flags.FLAG_FEATURE_COMBINATION_QUERY)
    public CameraCharacteristics getSessionCharacteristics(
            @NonNull SessionConfiguration sessionConfig) throws CameraAccessException {
        throw new UnsupportedOperationException("Subclasses must override this method");
    }

  /**
     * A callback objects for receiving updates about the state of a camera device.
     *
+12 −0
Original line number Diff line number Diff line
@@ -786,6 +786,18 @@ public class CameraDeviceImpl extends CameraDevice
        }
    }

    @Override
    public CameraCharacteristics getSessionCharacteristics(
            @NonNull SessionConfiguration sessionConfig) throws CameraAccessException,
            UnsupportedOperationException, IllegalArgumentException {
        synchronized (mInterfaceLock) {
            checkIfCameraClosedOrInError();
            CameraMetadataNative info = mRemoteDevice.getSessionCharacteristics(sessionConfig);

            return new CameraCharacteristics(info);
        }
    }

    /**
     * For use by backwards-compatibility code only.
     */
+24 −9
Original line number Diff line number Diff line
@@ -16,19 +16,12 @@

package android.hardware.camera2.impl;

import static android.hardware.camera2.CameraAccessException.CAMERA_DISABLED;
import static android.hardware.camera2.CameraAccessException.CAMERA_DISCONNECTED;
import static android.hardware.camera2.CameraAccessException.CAMERA_IN_USE;
import static android.hardware.camera2.CameraAccessException.CAMERA_ERROR;
import static android.hardware.camera2.CameraAccessException.MAX_CAMERAS_IN_USE;
import static android.hardware.camera2.CameraAccessException.CAMERA_DEPRECATED_HAL;

import android.hardware.ICameraService;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.ICameraDeviceUser;
import android.hardware.camera2.ICameraDeviceCallbacks;
import android.hardware.camera2.ICameraDeviceUser;
import android.hardware.camera2.ICameraOfflineSession;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.params.OutputConfiguration;
@@ -205,6 +198,28 @@ public class ICameraDeviceUserWrapper {
        }
    }

    /**
     * Fetches the CameraCharacteristics for a given session configuration.
     */
    public CameraMetadataNative getSessionCharacteristics(SessionConfiguration sessionConfig)
            throws CameraAccessException {
        try {
            return mRemoteDevice.getSessionCharacteristics(sessionConfig);
        } catch (ServiceSpecificException e) {
            if (e.errorCode == ICameraService.ERROR_INVALID_OPERATION) {
                throw new UnsupportedOperationException("Session characteristics query not "
                    + "supported");
            } else if (e.errorCode == ICameraService.ERROR_ILLEGAL_ARGUMENT) {
                throw new IllegalArgumentException("Invalid session configuration");
            }

            throw e;
        } catch (Throwable t) {
            CameraManager.throwAsPublicException(t);
            throw new UnsupportedOperationException("Unexpected exception", t);
        }
    }

    public long flush() throws CameraAccessException {
        try {
            return mRemoteDevice.flush();