From 0dd17509a953774039c0e73beac4b0546504c774 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Tue, 7 Jul 2015 10:43:07 -0700 Subject: Camera: Add ZERO_SHUTTER_LAG modes to noise reduction and edge enhancement This mode splits processing quality based on stream resolution, to enable ZSL operation where low-resolution (preview/recording) streams require more processing since they are immediately user-visible, while the high-resolution intermediate ZSL stream should have minimal/no processing since it will be reprocessed into final quality when necessary Bug: 22266686 Change-Id: Ib41102b66b07d61a099f021f8c6251f28c62686f --- .../android/hardware/camera2/CameraMetadata.java | 57 ++++++++++++++++++++++ .../android/hardware/camera2/CaptureRequest.java | 22 ++++++++- .../android/hardware/camera2/CaptureResult.java | 22 ++++++++- 3 files changed, 97 insertions(+), 4 deletions(-) (limited to 'core/java/android') diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index e8dbc5b..f7c6274 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -488,9 +488,13 @@ public abstract class CameraMetadata { *
  • {@link CaptureRequest#EDGE_MODE android.edge.mode}
  • * * + *
  • {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes} and + * {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes} will both list ZERO_SHUTTER_LAG as a supported mode.
  • * * + * @see CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES * @see CaptureRequest#EDGE_MODE + * @see CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES * @see CaptureRequest#NOISE_REDUCTION_MODE * @see CameraCharacteristics#REPROCESS_MAX_CAPTURE_STALL * @see CameraCharacteristics#REQUEST_MAX_NUM_INPUT_STREAMS @@ -593,9 +597,13 @@ public abstract class CameraMetadata { *
  • {@link CaptureRequest#REPROCESS_EFFECTIVE_EXPOSURE_FACTOR android.reprocess.effectiveExposureFactor}
  • * * + *
  • {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes} and + * {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes} will both list ZERO_SHUTTER_LAG as a supported mode.
  • * * + * @see CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES * @see CaptureRequest#EDGE_MODE + * @see CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES * @see CaptureRequest#NOISE_REDUCTION_MODE * @see CaptureRequest#REPROCESS_EFFECTIVE_EXPOSURE_FACTOR * @see CameraCharacteristics#REPROCESS_MAX_CAPTURE_STALL @@ -1999,6 +2007,30 @@ public abstract class CameraMetadata { */ public static final int EDGE_MODE_HIGH_QUALITY = 2; + /** + *

    Edge enhancement is applied at different levels for different output streams, + * based on resolution. Streams at maximum recording resolution (see {@link android.hardware.camera2.CameraDevice#createCaptureSession }) or below have + * edge enhancement applied, while higher-resolution streams have no edge enhancement + * applied. The level of edge enhancement for low-resolution streams is tuned so that + * frame rate is not impacted, and the quality is equal to or better than FAST (since it + * is only applied to lower-resolution outputs, quality may improve from FAST).

    + *

    This mode is intended to be used by applications operating in a zero-shutter-lag mode + * with YUV or PRIVATE reprocessing, where the application continuously captures + * high-resolution intermediate buffers into a circular buffer, from which a final image is + * produced via reprocessing when a user takes a picture. For such a use case, the + * high-resolution buffers must not have edge enhancement applied to maximize efficiency of + * preview and to avoid double-applying enhancement when reprocessed, while low-resolution + * buffers (used for recording or preview, generally) need edge enhancement applied for + * reasonable preview quality.

    + *

    This mode is guaranteed to be supported by devices that support either the + * YUV_REPROCESSING or PRIVATE_REPROCESSING capabilities + * ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES android.request.availableCapabilities} lists either of those capabilities).

    + * + * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES + * @see CaptureRequest#EDGE_MODE + */ + public static final int EDGE_MODE_ZERO_SHUTTER_LAG = 3; + // // Enumeration values for CaptureRequest#FLASH_MODE // @@ -2104,6 +2136,31 @@ public abstract class CameraMetadata { */ public static final int NOISE_REDUCTION_MODE_MINIMAL = 3; + /** + *

    Noise reduction is applied at different levels for different output streams, + * based on resolution. Streams at maximum recording resolution (see {@link android.hardware.camera2.CameraDevice#createCaptureSession }) or below have noise + * reduction applied, while higher-resolution streams have MINIMAL (if supported) or no + * noise reduction applied (if MINIMAL is not supported.) The degree of noise reduction + * for low-resolution streams is tuned so that frame rate is not impacted, and the quality + * is equal to or better than FAST (since it is only applied to lower-resolution outputs, + * quality may improve from FAST).

    + *

    This mode is intended to be used by applications operating in a zero-shutter-lag mode + * with YUV or PRIVATE reprocessing, where the application continuously captures + * high-resolution intermediate buffers into a circular buffer, from which a final image is + * produced via reprocessing when a user takes a picture. For such a use case, the + * high-resolution buffers must not have noise reduction applied to maximize efficiency of + * preview and to avoid over-applying noise filtering when reprocessing, while + * low-resolution buffers (used for recording or preview, generally) need noise reduction + * applied for reasonable preview quality.

    + *

    This mode is guaranteed to be supported by devices that support either the + * YUV_REPROCESSING or PRIVATE_REPROCESSING capabilities + * ({@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES android.request.availableCapabilities} lists either of those capabilities).

    + * + * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES + * @see CaptureRequest#NOISE_REDUCTION_MODE + */ + public static final int NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG = 4; + // // Enumeration values for CaptureRequest#SENSOR_TEST_PATTERN_MODE // diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 33cc962..f201fe9 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -1569,7 +1569,14 @@ public final class CaptureRequest extends CameraMetadata> * will be applied. HIGH_QUALITY mode indicates that the * camera device will use the highest-quality enhancement algorithms, * even if it slows down capture rate. FAST means the camera device will - * not slow down capture rate when applying edge enhancement.

    + * not slow down capture rate when applying edge enhancement. Every output stream will + * have a similar amount of enhancement applied.

    + *

    ZERO_SHUTTER_LAG is meant to be used by applications that maintain a continuous circular + * buffer of high-resolution images during preview and reprocess image(s) from that buffer + * into a final capture when triggered by the user. In this mode, the camera device applies + * edge enhancement to low-resolution streams (below maximum recording resolution) to + * maximize preview quality, but does not apply edge enhancement to high-resolution streams, + * since those will be reprocessed later if necessary.

    *

    For YUV_REPROCESSING, these FAST/HIGH_QUALITY modes both mean that the camera * device will apply FAST/HIGH_QUALITY YUV-domain edge enhancement, respectively. * The camera device may adjust its internal noise reduction parameters for best @@ -1579,6 +1586,7 @@ public final class CaptureRequest extends CameraMetadata> *

  • {@link #EDGE_MODE_OFF OFF}
  • *
  • {@link #EDGE_MODE_FAST FAST}
  • *
  • {@link #EDGE_MODE_HIGH_QUALITY HIGH_QUALITY}
  • + *
  • {@link #EDGE_MODE_ZERO_SHUTTER_LAG ZERO_SHUTTER_LAG}
  • *

    *

    Available values for this device:
    * {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes}

    @@ -1593,6 +1601,7 @@ public final class CaptureRequest extends CameraMetadata> * @see #EDGE_MODE_OFF * @see #EDGE_MODE_FAST * @see #EDGE_MODE_HIGH_QUALITY + * @see #EDGE_MODE_ZERO_SHUTTER_LAG */ @PublicKey public static final Key EDGE_MODE = @@ -1979,7 +1988,14 @@ public final class CaptureRequest extends CameraMetadata> * will be applied. HIGH_QUALITY mode indicates that the camera device * will use the highest-quality noise filtering algorithms, * even if it slows down capture rate. FAST means the camera device will not - * slow down capture rate when applying noise filtering.

    + * slow down capture rate when applying noise filtering. Every output stream will + * have a similar amount of enhancement applied.

    + *

    ZERO_SHUTTER_LAG is meant to be used by applications that maintain a continuous circular + * buffer of high-resolution images during preview and reprocess image(s) from that buffer + * into a final capture when triggered by the user. In this mode, the camera device applies + * noise reduction to low-resolution streams (below maximum recording resolution) to maximize + * preview quality, but does not apply noise reduction to high-resolution streams, since + * those will be reprocessed later if necessary.

    *

    For YUV_REPROCESSING, these FAST/HIGH_QUALITY modes both mean that the camera device * will apply FAST/HIGH_QUALITY YUV domain noise reduction, respectively. The camera device * may adjust the noise reduction parameters for best image quality based on the @@ -1990,6 +2006,7 @@ public final class CaptureRequest extends CameraMetadata> *

  • {@link #NOISE_REDUCTION_MODE_FAST FAST}
  • *
  • {@link #NOISE_REDUCTION_MODE_HIGH_QUALITY HIGH_QUALITY}
  • *
  • {@link #NOISE_REDUCTION_MODE_MINIMAL MINIMAL}
  • + *
  • {@link #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG ZERO_SHUTTER_LAG}
  • *

    *

    Available values for this device:
    * {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes}

    @@ -2005,6 +2022,7 @@ public final class CaptureRequest extends CameraMetadata> * @see #NOISE_REDUCTION_MODE_FAST * @see #NOISE_REDUCTION_MODE_HIGH_QUALITY * @see #NOISE_REDUCTION_MODE_MINIMAL + * @see #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG */ @PublicKey public static final Key NOISE_REDUCTION_MODE = diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 9dee045..0f80051 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -2081,7 +2081,14 @@ public class CaptureResult extends CameraMetadata> { * will be applied. HIGH_QUALITY mode indicates that the * camera device will use the highest-quality enhancement algorithms, * even if it slows down capture rate. FAST means the camera device will - * not slow down capture rate when applying edge enhancement.

    + * not slow down capture rate when applying edge enhancement. Every output stream will + * have a similar amount of enhancement applied.

    + *

    ZERO_SHUTTER_LAG is meant to be used by applications that maintain a continuous circular + * buffer of high-resolution images during preview and reprocess image(s) from that buffer + * into a final capture when triggered by the user. In this mode, the camera device applies + * edge enhancement to low-resolution streams (below maximum recording resolution) to + * maximize preview quality, but does not apply edge enhancement to high-resolution streams, + * since those will be reprocessed later if necessary.

    *

    For YUV_REPROCESSING, these FAST/HIGH_QUALITY modes both mean that the camera * device will apply FAST/HIGH_QUALITY YUV-domain edge enhancement, respectively. * The camera device may adjust its internal noise reduction parameters for best @@ -2091,6 +2098,7 @@ public class CaptureResult extends CameraMetadata> { *

  • {@link #EDGE_MODE_OFF OFF}
  • *
  • {@link #EDGE_MODE_FAST FAST}
  • *
  • {@link #EDGE_MODE_HIGH_QUALITY HIGH_QUALITY}
  • + *
  • {@link #EDGE_MODE_ZERO_SHUTTER_LAG ZERO_SHUTTER_LAG}
  • *

    *

    Available values for this device:
    * {@link CameraCharacteristics#EDGE_AVAILABLE_EDGE_MODES android.edge.availableEdgeModes}

    @@ -2105,6 +2113,7 @@ public class CaptureResult extends CameraMetadata> { * @see #EDGE_MODE_OFF * @see #EDGE_MODE_FAST * @see #EDGE_MODE_HIGH_QUALITY + * @see #EDGE_MODE_ZERO_SHUTTER_LAG */ @PublicKey public static final Key EDGE_MODE = @@ -2763,7 +2772,14 @@ public class CaptureResult extends CameraMetadata> { * will be applied. HIGH_QUALITY mode indicates that the camera device * will use the highest-quality noise filtering algorithms, * even if it slows down capture rate. FAST means the camera device will not - * slow down capture rate when applying noise filtering.

    + * slow down capture rate when applying noise filtering. Every output stream will + * have a similar amount of enhancement applied.

    + *

    ZERO_SHUTTER_LAG is meant to be used by applications that maintain a continuous circular + * buffer of high-resolution images during preview and reprocess image(s) from that buffer + * into a final capture when triggered by the user. In this mode, the camera device applies + * noise reduction to low-resolution streams (below maximum recording resolution) to maximize + * preview quality, but does not apply noise reduction to high-resolution streams, since + * those will be reprocessed later if necessary.

    *

    For YUV_REPROCESSING, these FAST/HIGH_QUALITY modes both mean that the camera device * will apply FAST/HIGH_QUALITY YUV domain noise reduction, respectively. The camera device * may adjust the noise reduction parameters for best image quality based on the @@ -2774,6 +2790,7 @@ public class CaptureResult extends CameraMetadata> { *

  • {@link #NOISE_REDUCTION_MODE_FAST FAST}
  • *
  • {@link #NOISE_REDUCTION_MODE_HIGH_QUALITY HIGH_QUALITY}
  • *
  • {@link #NOISE_REDUCTION_MODE_MINIMAL MINIMAL}
  • + *
  • {@link #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG ZERO_SHUTTER_LAG}
  • *

    *

    Available values for this device:
    * {@link CameraCharacteristics#NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES android.noiseReduction.availableNoiseReductionModes}

    @@ -2789,6 +2806,7 @@ public class CaptureResult extends CameraMetadata> { * @see #NOISE_REDUCTION_MODE_FAST * @see #NOISE_REDUCTION_MODE_HIGH_QUALITY * @see #NOISE_REDUCTION_MODE_MINIMAL + * @see #NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG */ @PublicKey public static final Key NOISE_REDUCTION_MODE = -- cgit v1.1