From a8d36036f2e75707f595d5ae1c18f20de9f0c176 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Mon, 15 Oct 2018 12:01:53 -0700 Subject: Camera: Enhance support for monochrome camera - Add new Color Filter Array enum. - Clarify doc for Bayer pattern related metadata. - Add DngCreator support for monochrome camera raw. Test: Camera CTS Test: Capture a monochrome DNG image and inspect with LightRoom Bug: 70216652 Change-Id: I329f224e3763dd5c777815a3cbb9dd7bd198c038 --- .../hardware/camera2/CameraCharacteristics.java | 26 ++++++++++++- .../android/hardware/camera2/CameraDevice.java | 2 +- .../android/hardware/camera2/CameraMetadata.java | 25 ++++++++++++- .../android/hardware/camera2/CaptureRequest.java | 10 ++--- .../android/hardware/camera2/CaptureResult.java | 43 ++++++++++++++++++---- .../hardware/camera2/params/BlackLevelPattern.java | 14 ++++++- .../hardware/camera2/params/TonemapCurve.java | 4 ++ 7 files changed, 105 insertions(+), 19 deletions(-) (limited to 'core/java') diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 444ca87a68ef..7148b124253e 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -28,8 +28,8 @@ import android.hardware.camera2.utils.ArrayUtils; import android.hardware.camera2.utils.TypeReference; import android.util.Rational; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -2668,7 +2668,8 @@ public final class CameraCharacteristics extends CameraMetadataThe arrangement of color filters on sensor; * represents the colors in the top-left 2x2 section of - * the sensor, in reading order.

+ * the sensor, in reading order, for a Bayer camera, or the + * light spectrum it captures for MONOCHROME camera.

*

Possible values: *

*

Optional - This value may be {@code null} on some devices.

*

Full capability - @@ -2688,6 +2691,8 @@ public final class CameraCharacteristics extends CameraMetadata SENSOR_INFO_COLOR_FILTER_ARRANGEMENT = @@ -2919,6 +2924,8 @@ public final class CameraCharacteristics extends CameraMetadataSome devices may choose to provide a second set of calibration * information for improved quality, including * {@link CameraCharacteristics#SENSOR_REFERENCE_ILLUMINANT2 android.sensor.referenceIlluminant2} and its corresponding matrices.

+ *

Starting from Android Q, this key will not be present for a MONOCHROME camera, even if + * the camera device has RAW capability.

*

Possible values: *

+ *

Starting from Android Q, this key will not be present for a MONOCHROME camera, even if + * the camera device has RAW capability.

*

Range of valid values:

*

>= 0

*

Optional - This value may be {@code null} on some devices.

@@ -3592,6 +3598,7 @@ public class CaptureResult extends CameraMetadata> { * layout key (see {@link CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT android.sensor.info.colorFilterArrangement}), i.e. the * nth value given corresponds to the black level offset for the nth * color channel listed in the CFA.

+ *

For a MONOCHROME camera, all of the 2x2 channels must have the same values.

*

This key will be available if {@link CameraCharacteristics#SENSOR_OPTICAL_BLACK_REGIONS android.sensor.opticalBlackRegions} is available or the * camera device advertises this key via {@link android.hardware.camera2.CameraCharacteristics#getAvailableCaptureResultKeys }.

*

Range of valid values:
@@ -3852,6 +3859,17 @@ public class CaptureResult extends CameraMetadata> { *

As a visualization only, inverting the full-color map to recover an * image of a gray wall (using bicubic interpolation for visual quality) as captured by the sensor gives:

*

Image of a uniform white wall (inverse shading map)

+ *

For a MONOCHROME camera, all of the 2x2 channels must have the same values. An example + * shading map for such a camera is defined as:

+ *
android.lens.info.shadingMapSize = [ 4, 3 ]
+     * android.statistics.lensShadingMap =
+     * [ 1.3, 1.3, 1.3, 1.3,  1.2, 1.2, 1.2, 1.2,
+     *     1.1, 1.1, 1.1, 1.1,  1.3, 1.3, 1.3, 1.3,
+     *   1.2, 1.2, 1.2, 1.2,  1.1, 1.1, 1.1, 1.1,
+     *     1.0, 1.0, 1.0, 1.0,  1.2, 1.2, 1.2, 1.2,
+     *   1.3, 1.3, 1.3, 1.3,   1.2, 1.2, 1.2, 1.2,
+     *     1.2, 1.2, 1.2, 1.2,  1.3, 1.3, 1.3, 1.3 ]
+     * 
*

Range of valid values:
* Each gain factor is >= 1

*

Optional - This value may be {@code null} on some devices.

@@ -3894,13 +3912,13 @@ public class CaptureResult extends CameraMetadata> { * (x,y) ϵ (0 ... N-1, 0 ... M-1) is the value of the shading map at * pixel ( ((W-1)/(N-1)) * x, ((H-1)/(M-1)) * y) for the four color channels. * The map is assumed to be bilinearly interpolated between the sample points.

- *

The channel order is [R, Geven, Godd, B], where Geven is the green - * channel for the even rows of a Bayer pattern, and Godd is the odd rows. + *

For a Bayer camera, the channel order is [R, Geven, Godd, B], where Geven is + * the green channel for the even rows of a Bayer pattern, and Godd is the odd rows. * The shading map is stored in a fully interleaved format, and its size * is provided in the camera static metadata by android.lens.info.shadingMapSize.

*

The shading map will generally have on the order of 30-40 rows and columns, * and will be smaller than 64x64.

- *

As an example, given a very small map defined as:

+ *

As an example, given a very small map for a Bayer camera defined as:

*
android.lens.info.shadingMapSize = [ 4, 3 ]
      * android.statistics.lensShadingMap =
      * [ 1.3, 1.2, 1.15, 1.2,  1.2, 1.2, 1.15, 1.2,
@@ -3920,6 +3938,17 @@ public class CaptureResult extends CameraMetadata> {
      * image of a gray wall (using bicubic interpolation for visual quality)
      * as captured by the sensor gives:

*

Image of a uniform white wall (inverse shading map)

+ *

For a MONOCHROME camera, all of the 2x2 channels must have the same values. An example + * shading map for such a camera is defined as:

+ *
android.lens.info.shadingMapSize = [ 4, 3 ]
+     * android.statistics.lensShadingMap =
+     * [ 1.3, 1.3, 1.3, 1.3,  1.2, 1.2, 1.2, 1.2,
+     *     1.1, 1.1, 1.1, 1.1,  1.3, 1.3, 1.3, 1.3,
+     *   1.2, 1.2, 1.2, 1.2,  1.1, 1.1, 1.1, 1.1,
+     *     1.0, 1.0, 1.0, 1.0,  1.2, 1.2, 1.2, 1.2,
+     *   1.3, 1.3, 1.3, 1.3,   1.2, 1.2, 1.2, 1.2,
+     *     1.2, 1.2, 1.2, 1.2,  1.3, 1.3, 1.3, 1.3 ]
+     * 
*

Note that the RAW image data might be subject to lens shading * correction not reported on this map. Query * {@link CameraCharacteristics#SENSOR_INFO_LENS_SHADING_APPLIED android.sensor.info.lensShadingApplied} to see if RAW image data has subject @@ -4250,8 +4279,8 @@ public class CaptureResult extends CameraMetadata> { * of points can be less than max (that is, the request doesn't have to * always provide a curve with number of points equivalent to * {@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS android.tonemap.maxCurvePoints}).

- *

For devices with MONOCHROME capability, only red channel is used. Green and blue channels - * are ignored.

+ *

For devices with MONOCHROME capability, all three channels must have the same set of + * control points.

*

A few examples, and their corresponding graphical mappings; these * only specify the red channel and the precision is limited to 4 * digits, for conciseness.

@@ -4314,8 +4343,8 @@ public class CaptureResult extends CameraMetadata> { * of points can be less than max (that is, the request doesn't have to * always provide a curve with number of points equivalent to * {@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS android.tonemap.maxCurvePoints}).

- *

For devices with MONOCHROME capability, only red channel is used. Green and blue channels - * are ignored.

+ *

For devices with MONOCHROME capability, all three channels must have the same set of + * control points.

*

A few examples, and their corresponding graphical mappings; these * only specify the red channel and the precision is limited to 4 * digits, for conciseness.

diff --git a/core/java/android/hardware/camera2/params/BlackLevelPattern.java b/core/java/android/hardware/camera2/params/BlackLevelPattern.java index 6d6c094ebf04..283977fecbd5 100644 --- a/core/java/android/hardware/camera2/params/BlackLevelPattern.java +++ b/core/java/android/hardware/camera2/params/BlackLevelPattern.java @@ -16,13 +16,17 @@ package android.hardware.camera2.params; -import java.util.Arrays; - import static com.android.internal.util.Preconditions.checkNotNull; +import java.util.Arrays; + /** * Immutable class to store a 4-element vector of integers corresponding to a 2x2 pattern * of color channel offsets used for the black level offsets of each color channel. + * + * For a camera device with + * {@link android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME + * MONOCHROME} capability, all 4 elements of the pattern will have the same value. */ public final class BlackLevelPattern { @@ -133,6 +137,12 @@ public final class BlackLevelPattern { * {@link android.hardware.camera2.CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT}). *

* + *

A {@link + * android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME + * MONOCHROME} camera only has one channel. As a result, the returned string will contain 4 + * identical values. + *

+ * * @return string representation of {@link BlackLevelPattern} * * @see android.hardware.camera2.CameraCharacteristics#SENSOR_INFO_COLOR_FILTER_ARRANGEMENT diff --git a/core/java/android/hardware/camera2/params/TonemapCurve.java b/core/java/android/hardware/camera2/params/TonemapCurve.java index 71e68a5271c2..90e63556f018 100644 --- a/core/java/android/hardware/camera2/params/TonemapCurve.java +++ b/core/java/android/hardware/camera2/params/TonemapCurve.java @@ -34,6 +34,10 @@ import java.util.Arrays; * use as the tonemapping/contrast/gamma curve when {@link CaptureRequest#TONEMAP_MODE} is * set to {@link CameraMetadata#TONEMAP_MODE_CONTRAST_CURVE}.

* + *

For a camera device with + * {@link android.hardware.camera2.CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME + * MONOCHROME} capability, all 3 channels will contain the same set of control points. + * *

The total number of points {@code (Pin, Pout)} for each color channel can be no more than * {@link CameraCharacteristics#TONEMAP_MAX_CURVE_POINTS}.

* -- cgit v1.2.3