Merge "Camera: Tonemap CTS update for HAL3.3" into mnc-dev
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 9bbcc43..be80eea 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -1435,6 +1435,10 @@
if (mStaticInfo.areKeysAvailable(TONEMAP_MODE)) {
mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE);
+ mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
+ CaptureRequest.TONEMAP_MODE_GAMMA_VALUE);
+ mCollector.expectKeyValueNotEquals(request, TONEMAP_MODE,
+ CaptureRequest.TONEMAP_MODE_PRESET_CURVE);
}
if (mStaticInfo.areKeysAvailable(STATISTICS_LENS_SHADING_MAP_MODE)) {
mCollector.expectKeyValueNotNull(request, STATISTICS_LENS_SHADING_MAP_MODE);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index 68c8077..f3acf4c 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -1389,73 +1389,70 @@
return;
}
- SimpleCaptureCallback listener;
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-
- Size maxPreviewSz = mOrderedPreviewSizes.get(0); // Max preview size.
-
int[] toneMapModes = mStaticInfo.getAvailableToneMapModesChecked();
for (int mode : toneMapModes) {
- requestBuilder.set(CaptureRequest.TONEMAP_MODE, mode);
if (VERBOSE) {
Log.v(TAG, "Testing tonemap mode " + mode);
}
- if (mode == CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE) {
- TonemapCurve tcLinear = new TonemapCurve(
- TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR);
- requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcLinear);
- // Create a new listener for each run to avoid the results from one run spill
- // into another run.
- listener = new SimpleCaptureCallback();
- startPreview(requestBuilder, maxPreviewSz, listener);
- waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
- verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
- TONEMAP_CURVE_LINEAR);
+ requestBuilder.set(CaptureRequest.TONEMAP_MODE, mode);
+ switch (mode) {
+ case CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE:
+ TonemapCurve toneCurve = new TonemapCurve(TONEMAP_CURVE_LINEAR,
+ TONEMAP_CURVE_LINEAR, TONEMAP_CURVE_LINEAR);
+ requestBuilder.set(CaptureRequest.TONEMAP_CURVE, toneCurve);
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
- TonemapCurve tcSrgb = new TonemapCurve(
- TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB);
- requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcSrgb);
- // Create a new listener for each run to avoid the results from one run spill
- // into another run.
- listener = new SimpleCaptureCallback();
- startPreview(requestBuilder, maxPreviewSz, listener);
- waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
- verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
- TONEMAP_CURVE_SRGB);
- } else {
- // Create a new listener for each run to avoid the results from one run spill
- // into another run.
- listener = new SimpleCaptureCallback();
- startPreview(requestBuilder, maxPreviewSz, listener);
- waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
- verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
- /*inputToneCurve*/null);
+ toneCurve = new TonemapCurve(TONEMAP_CURVE_SRGB,
+ TONEMAP_CURVE_SRGB, TONEMAP_CURVE_SRGB);
+ requestBuilder.set(CaptureRequest.TONEMAP_CURVE, toneCurve);
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+ break;
+ case CaptureRequest.TONEMAP_MODE_GAMMA_VALUE:
+ requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 1.0f);
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+ requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 2.2f);
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+ requestBuilder.set(CaptureRequest.TONEMAP_GAMMA, 5.0f);
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+ break;
+ case CaptureRequest.TONEMAP_MODE_PRESET_CURVE:
+ requestBuilder.set(CaptureRequest.TONEMAP_PRESET_CURVE,
+ CaptureRequest.TONEMAP_PRESET_CURVE_REC709);
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+ requestBuilder.set(CaptureRequest.TONEMAP_PRESET_CURVE,
+ CaptureRequest.TONEMAP_PRESET_CURVE_SRGB);
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+ break;
+ default:
+ testToneMapMode(NUM_FRAMES_VERIFIED, requestBuilder);
+ break;
}
}
- stopPreview();
+
}
/**
- * Verify tonemap results.
- * <p>
- * Assumes R,G,B channels use the same tone curve
- * </p>
+ * Test tonemap mode with speficied request settings
*
- * @param listener The capture listener used to get the capture results
* @param numFramesVerified Number of results to be verified
- * @param tonemapMode Tonemap mode to verify
- * @param inputToneCurve Tonemap curve used by all 3 channels, ignored when
- * map mode is not CONTRAST_CURVE.
+ * @param requestBuilder the request builder of settings to be tested
*/
- private void verifyToneMapModeResults(SimpleCaptureCallback listener, int numFramesVerified,
- int tonemapMode, float[] inputToneCurve) {
+ private void testToneMapMode (int numFramesVerified,
+ CaptureRequest.Builder requestBuilder) throws Exception {
final int MIN_TONEMAP_CURVE_POINTS = 2;
final Float ZERO = new Float(0);
final Float ONE = new Float(1.0f);
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
+ int tonemapMode = requestBuilder.get(CaptureRequest.TONEMAP_MODE);
+ Size maxPreviewSz = mOrderedPreviewSizes.get(0); // Max preview size.
+ startPreview(requestBuilder, maxPreviewSz, listener);
+ waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
+
int maxCurvePoints = mStaticInfo.getMaxTonemapCurvePointChecked();
for (int i = 0; i < numFramesVerified; i++) {
CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -1477,6 +1474,14 @@
* between request and result, as they may have different array
* size.
*/
+ } else if (tonemapMode == CaptureResult.TONEMAP_MODE_GAMMA_VALUE) {
+ mCollector.expectEquals("Capture result gamma value should match request",
+ requestBuilder.get(CaptureRequest.TONEMAP_GAMMA),
+ result.get(CaptureResult.TONEMAP_GAMMA));
+ } else if (tonemapMode == CaptureResult.TONEMAP_MODE_PRESET_CURVE) {
+ mCollector.expectEquals("Capture result preset curve should match request",
+ requestBuilder.get(CaptureRequest.TONEMAP_PRESET_CURVE),
+ result.get(CaptureResult.TONEMAP_PRESET_CURVE));
}
// Tonemap curve result availability and basic sanity check for all modes.
@@ -1493,6 +1498,7 @@
mCollector.expectInRange("Tonemap curve blue length is out of range",
mapBlue.length, MIN_TONEMAP_CURVE_POINTS, maxCurvePoints * 2);
}
+ stopPreview();
}
/**
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
index f504b44..246844b 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java
@@ -204,11 +204,13 @@
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP , LEGACY , BC );
+ expectKeyAvailable(c, CameraCharacteristics.CONTROL_AE_LOCK_AVAILABLE , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES , LEGACY , BC );
+ expectKeyAvailable(c, CameraCharacteristics.CONTROL_AWB_LOCK_AVAILABLE , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AE , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AF , LEGACY , BC );
expectKeyAvailable(c, CameraCharacteristics.CONTROL_MAX_REGIONS_AWB , LEGACY , BC );
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
index 31f9188..0dba61e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StaticMetadataTest.java
@@ -321,6 +321,7 @@
// Legacy mode always doesn't support these requirements
Boolean contrastCurveModeSupported = false;
+ Boolean gammaAndPresetModeSupported = false;
Boolean offColorAberrationModeSupported = false;
if (mStaticInfo.isHardwareLevelLimitedOrBetter()) {
int[] tonemapModes = mStaticInfo.getAvailableToneMapModesChecked();
@@ -329,6 +330,10 @@
Arrays.asList(CameraTestUtils.toObject(tonemapModes));
contrastCurveModeSupported =
modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE);
+ gammaAndPresetModeSupported =
+ modeList.contains(CameraMetadata.TONEMAP_MODE_GAMMA_VALUE) &&
+ modeList.contains(CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
+
int[] colorAberrationModes =
mStaticInfo.getAvailableColorAberrationModesChecked();
modeList = (colorAberrationModes.length == 0) ?
@@ -337,8 +342,12 @@
offColorAberrationModeSupported =
modeList.contains(CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF);
}
+ Boolean tonemapModeQualified =
+ contrastCurveModeSupported || gammaAndPresetModeSupported;
additionalRequirements.add(new Pair<String, Boolean>(
- "Tonemap mode must include CONTRAST_CURVE", contrastCurveModeSupported));
+ "Tonemap mode must include {CONTRAST_CURVE} and/or " +
+ "{GAMMA_VALUE, PRESET_CURVE}",
+ tonemapModeQualified));
additionalRequirements.add(new Pair<String, Boolean>(
"Color aberration mode must include OFF", offColorAberrationModeSupported));
additionalRequirements.add(new Pair<String, Boolean>(
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
index a22db8f..b452c50 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/StaticMetadata.java
@@ -678,13 +678,8 @@
List<Integer> modeList = Arrays.asList(CameraTestUtils.toObject(modes));
checkTrueForKey(key, " Camera devices must always support FAST mode",
modeList.contains(CameraMetadata.TONEMAP_MODE_FAST));
- if (isCapabilitySupported(
- CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING)) {
- checkTrueForKey(key, "MANUAL_POST_PROCESSING supported camera devices must support"
- + "CONTRAST_CURVE mode",
- modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE) &&
- modeList.contains(CameraMetadata.TONEMAP_MODE_FAST));
- }
+ // Qualification check for MANUAL_POSTPROCESSING capability is in
+ // StaticMetadataTest#testCapabilities
if (isHardwareLevelLimitedOrBetter()) {
// FAST and HIGH_QUALITY mode must be both present or both not present
@@ -698,7 +693,7 @@
}
checkElementDistinct(key, modeList);
checkArrayValuesInRange(key, modes, CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE,
- CameraMetadata.TONEMAP_MODE_HIGH_QUALITY);
+ CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
return modes;
}
@@ -711,16 +706,23 @@
public int getMaxTonemapCurvePointChecked() {
Key<Integer> key = CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS;
Integer count = getValueFromKeyNonNull(key);
+ List<Integer> modeList =
+ Arrays.asList(CameraTestUtils.toObject(getAvailableToneMapModesChecked()));
+ boolean tonemapCurveOutputSupported =
+ modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE) ||
+ modeList.contains(CameraMetadata.TONEMAP_MODE_GAMMA_VALUE) ||
+ modeList.contains(CameraMetadata.TONEMAP_MODE_PRESET_CURVE);
if (count == null) {
+ if (tonemapCurveOutputSupported) {
+ Assert.fail("Tonemap curve output is supported but MAX_CURVE_POINTS is null");
+ }
return 0;
}
- List<Integer> modeList =
- Arrays.asList(CameraTestUtils.toObject(getAvailableToneMapModesChecked()));
- if (modeList.contains(CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE)) {
- checkTrueForKey(key, "Full-capability camera device must support maxCurvePoints "
- + ">= " + TONEMAP_MAX_CURVE_POINTS_AT_LEAST,
+ if (tonemapCurveOutputSupported) {
+ checkTrueForKey(key, "Tonemap curve output supported camera device must support "
+ + "maxCurvePoints >= " + TONEMAP_MAX_CURVE_POINTS_AT_LEAST,
count >= TONEMAP_MAX_CURVE_POINTS_AT_LEAST);
}