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

Commit af68bebb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera: Initial support for Camera2 extension"

parents 89878bc9 9c778e19
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
@@ -17631,6 +17631,7 @@ package android.hardware.camera2 {
    method public void createCaptureSession(android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
    method @Deprecated public abstract void createCaptureSessionByOutputConfigurations(java.util.List<android.hardware.camera2.params.OutputConfiguration>, android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
    method @Deprecated public abstract void createConstrainedHighSpeedCaptureSession(@NonNull java.util.List<android.view.Surface>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
    method public void createExtensionSession(@NonNull android.hardware.camera2.params.ExtensionSessionConfiguration) throws android.hardware.camera2.CameraAccessException;
    method @NonNull public abstract android.hardware.camera2.CaptureRequest.Builder createReprocessCaptureRequest(@NonNull android.hardware.camera2.TotalCaptureResult) throws android.hardware.camera2.CameraAccessException;
    method @Deprecated public abstract void createReprocessableCaptureSession(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.view.Surface>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
    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;
@@ -17662,8 +17663,44 @@ package android.hardware.camera2 {
    field public static final int ERROR_MAX_CAMERAS_IN_USE = 2; // 0x2
  }
  public final class CameraExtensionCharacteristics {
    method @NonNull public <T> java.util.List<android.util.Size> getExtensionSupportedSizes(int, @NonNull Class<T>);
    method @NonNull public java.util.List<android.util.Size> getExtensionSupportedSizes(int, int);
    method @NonNull public java.util.List<java.lang.Integer> getSupportedExtensions();
    field public static final int EXTENSION_AUTOMATIC = 0; // 0x0
    field public static final int EXTENSION_BEAUTY = 1; // 0x1
    field public static final int EXTENSION_BOKEH = 2; // 0x2
    field public static final int EXTENSION_HDR = 3; // 0x3
    field public static final int EXTENSION_NIGHT = 4; // 0x4
  }
  public abstract class CameraExtensionSession implements java.lang.AutoCloseable {
    method public int capture(@NonNull android.hardware.camera2.CaptureRequest, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraExtensionSession.ExtensionCaptureCallback) throws android.hardware.camera2.CameraAccessException;
    method public void close() throws android.hardware.camera2.CameraAccessException;
    method @NonNull public android.hardware.camera2.CameraDevice getDevice();
    method public int setRepeatingRequest(@NonNull android.hardware.camera2.CaptureRequest, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraExtensionSession.ExtensionCaptureCallback) throws android.hardware.camera2.CameraAccessException;
    method public void stopRepeating() throws android.hardware.camera2.CameraAccessException;
  }
  public abstract static class CameraExtensionSession.ExtensionCaptureCallback {
    ctor public CameraExtensionSession.ExtensionCaptureCallback();
    method public void onCaptureFailed(@NonNull android.hardware.camera2.CameraExtensionSession, @NonNull android.hardware.camera2.CaptureRequest);
    method public void onCaptureProcessStarted(@NonNull android.hardware.camera2.CameraExtensionSession, @NonNull android.hardware.camera2.CaptureRequest);
    method public void onCaptureSequenceAborted(@NonNull android.hardware.camera2.CameraExtensionSession, int);
    method public void onCaptureSequenceCompleted(@NonNull android.hardware.camera2.CameraExtensionSession, int);
    method public void onCaptureStarted(@NonNull android.hardware.camera2.CameraExtensionSession, @NonNull android.hardware.camera2.CaptureRequest, long);
  }
  public abstract static class CameraExtensionSession.StateCallback {
    ctor public CameraExtensionSession.StateCallback();
    method public void onClosed(@NonNull android.hardware.camera2.CameraExtensionSession);
    method public abstract void onConfigureFailed(@NonNull android.hardware.camera2.CameraExtensionSession);
    method public abstract void onConfigured(@NonNull android.hardware.camera2.CameraExtensionSession);
  }
  public final class CameraManager {
    method @NonNull public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics(@NonNull String) throws android.hardware.camera2.CameraAccessException;
    method @NonNull public android.hardware.camera2.CameraExtensionCharacteristics getCameraExtensionCharacteristics(@NonNull String) throws android.hardware.camera2.CameraAccessException;
    method @NonNull public String[] getCameraIdList() throws android.hardware.camera2.CameraAccessException;
    method @NonNull public java.util.Set<java.util.Set<java.lang.String>> getConcurrentCameraIds() throws android.hardware.camera2.CameraAccessException;
    method @RequiresPermission(android.Manifest.permission.CAMERA) public boolean isConcurrentSessionConfigurationSupported(@NonNull java.util.Map<java.lang.String,android.hardware.camera2.params.SessionConfiguration>) throws android.hardware.camera2.CameraAccessException;
@@ -18173,6 +18210,14 @@ package android.hardware.camera2.params {
    method public android.util.Rational getElement(int, int);
  }
  public final class ExtensionSessionConfiguration {
    ctor public ExtensionSessionConfiguration(int, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraExtensionSession.StateCallback);
    method @NonNull public java.util.concurrent.Executor getExecutor();
    method public int getExtension();
    method @NonNull public java.util.List<android.hardware.camera2.params.OutputConfiguration> getOutputConfigurations();
    method @NonNull public android.hardware.camera2.CameraExtensionSession.StateCallback getStateCallback();
  }
  public final class Face {
    method public android.graphics.Rect getBounds();
    method public int getId();
+61 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.hardware.camera2.params.ExtensionSessionConfiguration;
import android.hardware.camera2.params.InputConfiguration;
import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.params.SessionConfiguration;
@@ -350,6 +351,66 @@ public abstract class CameraDevice implements AutoCloseable {
            @Nullable Handler handler)
            throws CameraAccessException;

    /**
     * Initialize a specific device-specific extension augmented camera capture
     * session.
     *
     * <p>Extension sessions can be used to enable device-specific operation modes like
     * {@link CameraExtensionCharacteristics#EXTENSION_NIGHT} or
     * {@link CameraExtensionCharacteristics#EXTENSION_HDR}. These modes are less flexible than the
     * full camera API, but enable access to more sophisticated processing algorithms that can
     * capture multi-frame bursts to generate single output images. To query for available
     * extensions on this device call
     * {@link CameraExtensionCharacteristics#getSupportedExtensions()}.</p>
     *
     * <p>This method will also trigger the setup of the internal
     * processing pipeline for extension augmented preview and multi-frame
     * still capture.</p>
     *
     * <p>If a prior CameraCaptureSession already exists when this method is called, the previous
     * session will no longer be able to accept new capture requests and will be closed. Any
     * in-progress capture requests made on the prior session will be completed before it's closed.
     * </p>
     *
     * <p>The CameraExtensionSession will be active until the client
     * either calls CameraExtensionSession.close() or creates a new camera
     * capture session. In both cases all internal resources will be
     * released, continuous repeating requests stopped and any pending
     * multi-frame capture requests flushed.</p>
     *
     * <p>Note that the CameraExtensionSession currently supports at most two
     * multi frame capture surface formats: ImageFormat.YUV_420_888 and
     * ImageFormat.JPEG. Clients must query the multi-frame capture format support using
     * {@link CameraExtensionCharacteristics#getExtensionSupportedSizes(int, int)}.
     * For repeating requests CameraExtensionSession supports only
     * {@link android.graphics.SurfaceTexture} as output. Clients can query the supported resolution
     * for the repeating request output using
     * {@link CameraExtensionCharacteristics#getExtensionSupportedSizes(int, Class)
     * getExtensionSupportedSizes(..., Class)}.</p>
     *
     * <p>At the very minimum the initialization expects either one valid output
     * surface for repeating or one valid output for high-quality single requests registered in the
     * outputs argument of the extension configuration argument. At the maximum the initialization
     * will accept two valid output surfaces, one for repeating and the other for single requests.
     * Additional unsupported surfaces passed to ExtensionSessionConfiguration will cause an
     * {@link IllegalArgumentException} to be thrown.</p>
     *
     * @param extensionConfiguration extension configuration
     * @throws IllegalArgumentException If both the preview and still
     *                                  capture surfaces are not set or invalid, or if any of the
     *                                  registered surfaces do not meet the device-specific
     *                                  extension requirements such as dimensions and/or
     *                                  (output format)/(surface type), or if the extension is not
     *                                  supported.
     * @see CameraExtensionCharacteristics#getSupportedExtensions
     * @see CameraExtensionCharacteristics#getExtensionSupportedSizes
     */
    public void createExtensionSession(
            @NonNull ExtensionSessionConfiguration extensionConfiguration)
            throws CameraAccessException {
        throw new UnsupportedOperationException("No default implementation");
    }

    /**
     * Standard camera operation mode.
     *
+546 −0

File added.

Preview size limit exceeded, changes collapsed.

+383 −0

File added.

Preview size limit exceeded, changes collapsed.

+25 −1
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.hardware.ICameraService;
import android.hardware.ICameraServiceListener;
import android.hardware.camera2.impl.CameraDeviceImpl;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.params.ExtensionSessionConfiguration;
import android.hardware.camera2.params.SessionConfiguration;
import android.hardware.camera2.utils.CameraIdAndSessionConfiguration;
import android.hardware.camera2.utils.ConcurrentCameraIdCombination;
@@ -434,6 +435,28 @@ public final class CameraManager {
        return characteristics;
    }

    /**
     * <p>Query the camera extension capabilities of a camera device.</p>
     *
     * @param cameraId The id of the camera device to query. This must be a standalone
     * camera ID which can be directly opened by {@link #openCamera}.
     * @return The properties of the given camera
     *
     * @throws IllegalArgumentException if the cameraId does not match any
     *         known camera device.
     * @throws CameraAccessException if the camera device has been disconnected.
     *
     * @see CameraExtensionCharacteristics
     * @see CameraDevice#createExtensionSession(ExtensionSessionConfiguration)
     * @see CameraExtensionSession
     */
    @NonNull
    public CameraExtensionCharacteristics getCameraExtensionCharacteristics(
            @NonNull String cameraId) throws CameraAccessException {
        CameraCharacteristics chars = getCameraCharacteristics(cameraId);
        return new CameraExtensionCharacteristics(mContext, cameraId, chars);
    }

    /**
     * Helper for opening a connection to a camera with the given ID.
     *
@@ -473,7 +496,8 @@ public final class CameraManager {
                        callback,
                        executor,
                        characteristics,
                        mContext.getApplicationInfo().targetSdkVersion);
                        mContext.getApplicationInfo().targetSdkVersion,
                        mContext);

            ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();

Loading