diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-07-19 16:44:31 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-07-19 16:44:31 +0000 |
commit | 43b5772991abc835cd798a1b765d8f10ea04c8e6 (patch) | |
tree | 02cf7084f1c95271c8dc47cd952cb401f742d734 | |
parent | b31526c1101693c791894f13e14f12467d63dcb4 (diff) | |
parent | 9445a46eff503c0c59c32913b38bbe507a27455d (diff) | |
download | cts-43b5772991abc835cd798a1b765d8f10ea04c8e6.tar.gz |
Merge "Camera: Migrate camera MPC test to PerformanceClassEvaluator" into stage-aosp-tm-ts-dev am: 9445a46eff
Original change: https://googleplex-android-review.googlesource.com/c/platform/cts/+/19139044
Change-Id: I2a295249fa495e8c7871f7bb221c0da8a580abe0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
11 files changed, 839 insertions, 358 deletions
diff --git a/apps/CtsVerifier/Android.bp b/apps/CtsVerifier/Android.bp index 9b2c16a3d09..024e0387c6f 100644 --- a/apps/CtsVerifier/Android.bp +++ b/apps/CtsVerifier/Android.bp @@ -91,6 +91,7 @@ android_library { "CtsForceStopHelper-constants", "ctsmediautil", "DpmWrapper", + "MediaPerformanceClassCommon", ], libs: ["telephony-common"] + ["android.test.runner.stubs"] + ["android.test.base.stubs"] + ["android.test.mock.stubs"] + ["android.car-test-stubs"] + ["voip-common"] + ["truth-prebuilt"], diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java index d83464bd549..692538a81c3 100644 --- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java +++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java @@ -21,9 +21,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; -import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; -import android.os.Build; +import android.mediapc.cts.common.PerformanceClassEvaluator; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; import android.util.Log; @@ -31,6 +30,11 @@ import android.view.WindowManager; import android.widget.TextView; import android.widget.Toast; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -39,17 +43,11 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - import com.android.compatibility.common.util.ResultType; import com.android.compatibility.common.util.ResultUnit; import com.android.cts.verifier.ArrayTestListAdapter; @@ -59,6 +57,7 @@ import com.android.cts.verifier.TestResult; import org.json.JSONArray; import org.json.JSONObject; +import org.junit.rules.TestName; /** * Test for Camera features that require that the camera be aimed at a specific test scene. @@ -81,12 +80,6 @@ public class ItsTestActivity extends DialogTestListActivity { Arrays.asList(new String[] {RESULT_PASS, RESULT_FAIL, RESULT_NOT_EXECUTED})); private static final int MAX_SUMMARY_LEN = 200; - private static final int MPC12_CAMERA_LAUNCH_THRESHOLD = 600; // ms - private static final int MPC12_JPEG_CAPTURE_THRESHOLD = 1000; // ms - - private static final String MPC_TESTS_REPORT_LOG_NAME = "MediaPerformanceClassLogs"; - private static final String MPC_TESTS_REPORT_LOG_SECTION = "CameraIts"; - private static final Pattern MPC12_CAMERA_LAUNCH_PATTERN = Pattern.compile("camera_launch_time_ms:(\\d+(\\.\\d+)?)"); private static final Pattern MPC12_JPEG_CAPTURE_PATTERN = @@ -95,8 +88,12 @@ public class ItsTestActivity extends DialogTestListActivity { private final ResultReceiver mResultsReceiver = new ResultReceiver(); private boolean mReceiverRegistered = false; + public final TestName mTestName = new TestName(); + // Initialized in onCreate List<String> mToBeTestedCameraIds = null; + String mPrimaryRearCameraId = null; + String mPrimaryFrontCameraId = null; // Scenes private static final ArrayList<String> mSceneIds = new ArrayList<String> () {{ @@ -132,8 +129,15 @@ public class ItsTestActivity extends DialogTestListActivity { private final HashMap<ResultKey, String> mSummaryMap = new HashMap<>(); // All primary cameras for which MPC level test has run private Set<ResultKey> mExecutedMpcTests = null; - // Map primary camera id to MPC level - private final HashMap<String, Integer> mMpcLevelMap = new HashMap<>(); + private static final String MPC_LAUNCH_REQ_NUM = "2.2.7.2/7.5/H-1-6"; + private static final String MPC_JPEG_CAPTURE_REQ_NUM = "2.2.7.2/7.5/H-1-5"; + // Performance class evaluator used for writing test result + PerformanceClassEvaluator mPce = new PerformanceClassEvaluator(mTestName); + PerformanceClassEvaluator.CameraLatencyRequirement mJpegLatencyReq = + mPce.addR7_5__H_1_5(); + PerformanceClassEvaluator.CameraLatencyRequirement mLaunchLatencyReq = + mPce.addR7_5__H_1_6(); + final class ResultKey { public final String cameraId; @@ -266,10 +270,7 @@ public class ItsTestActivity extends DialogTestListActivity { JSONArray metrics = sceneResult.getJSONArray("mpc_metrics"); for (int i = 0; i < metrics.length(); i++) { String mpcResult = metrics.getString(i); - if (!matchMpcResult(cameraId, mpcResult, MPC12_CAMERA_LAUNCH_PATTERN, - "2.2.7.2/7.5/H-1-6", MPC12_CAMERA_LAUNCH_THRESHOLD) && - !matchMpcResult(cameraId, mpcResult, MPC12_JPEG_CAPTURE_PATTERN, - "2.2.7.2/7.5/H-1-5", MPC12_JPEG_CAPTURE_THRESHOLD)) { + if (!matchMpcResult(cameraId, mpcResult)) { Log.e(TAG, "Error parsing MPC result string:" + mpcResult); return; } @@ -294,17 +295,6 @@ public class ItsTestActivity extends DialogTestListActivity { summary.toString(), 1.0, ResultType.NEUTRAL, ResultUnit.NONE); } - // Save MPC info once both front primary and rear primary data are collected. - if (mExecutedMpcTests.size() == 4) { - ItsTestActivity.this.getReportLog().addValue( - "Version", "0.0.1", ResultType.NEUTRAL, ResultUnit.NONE); - for (Map.Entry<String, Integer> entry : mMpcLevelMap.entrySet()) { - ItsTestActivity.this.getReportLog().addValue(entry.getKey(), - entry.getValue(), ResultType.NEUTRAL, ResultUnit.NONE); - } - ItsTestActivity.this.getReportLog().submit(); - } - // Display current progress StringBuilder progress = new StringBuilder(); for (ResultKey k : mAllScenes) { @@ -367,28 +357,44 @@ public class ItsTestActivity extends DialogTestListActivity { } } - private boolean matchMpcResult(String cameraId, String mpcResult, Pattern pattern, - String reqNum, float threshold) { - Matcher matcher = pattern.matcher(mpcResult); - boolean match = matcher.matches(); - final int LATEST_MPC_LEVEL = Build.VERSION_CODES.TIRAMISU; + private boolean matchMpcResult(String cameraId, String mpcResult) { + Matcher launchMatcher = MPC12_CAMERA_LAUNCH_PATTERN.matcher(mpcResult); + boolean launchMatches = launchMatcher.matches(); - if (match) { - // Store test result - ItsTestActivity.this.getReportLog().addValue("Cam" + cameraId, - mpcResult, ResultType.NEUTRAL, ResultUnit.NONE); + Matcher jpegMatcher = MPC12_JPEG_CAPTURE_PATTERN.matcher(mpcResult); + boolean jpegMatches = jpegMatcher.matches(); - float latency = Float.parseFloat(matcher.group(1)); - int mpcLevel = latency < threshold ? LATEST_MPC_LEVEL : 0; - mExecutedMpcTests.add(new ResultKey(cameraId, reqNum)); + if (!launchMatches && !jpegMatches) { + return false; + } + if (!cameraId.equals(mPrimaryRearCameraId) && + !cameraId.equals(mPrimaryFrontCameraId)) { + return false; + } - if (mMpcLevelMap.containsKey(reqNum)) { - mpcLevel = Math.min(mpcLevel, mMpcLevelMap.get(reqNum)); + if (launchMatches) { + float latency = Float.parseFloat(launchMatcher.group(1)); + if (cameraId.equals(mPrimaryRearCameraId)) { + mLaunchLatencyReq.setRearCameraLatency(latency); + } else { + mLaunchLatencyReq.setFrontCameraLatency(latency); + } + mExecutedMpcTests.add(new ResultKey(cameraId, MPC_LAUNCH_REQ_NUM)); + } else { + float latency = Float.parseFloat(jpegMatcher.group(1)); + if (cameraId.equals(mPrimaryRearCameraId)) { + mJpegLatencyReq.setRearCameraLatency(latency); + } else { + mJpegLatencyReq.setFrontCameraLatency(latency); } - mMpcLevelMap.put(reqNum, mpcLevel); + mExecutedMpcTests.add(new ResultKey(cameraId, MPC_JPEG_CAPTURE_REQ_NUM)); } - return match; + // Save MPC info once both front primary and rear primary data are collected. + if (mExecutedMpcTests.size() == 4) { + mPce.submit(); + } + return true; } } @@ -397,8 +403,11 @@ public class ItsTestActivity extends DialogTestListActivity { // Hide the test if all camera devices are legacy CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE); try { - ItsUtils.ItsCameraIdList cameraIdList = ItsUtils.getItsCompatibleCameraIds(manager); + ItsUtils.ItsCameraIdList cameraIdList = + ItsUtils.getItsCompatibleCameraIds(manager); mToBeTestedCameraIds = cameraIdList.mCameraIdCombos; + mPrimaryRearCameraId = cameraIdList.mPrimaryRearCameraId; + mPrimaryFrontCameraId = cameraIdList.mPrimaryFrontCameraId; } catch (ItsException e) { Toast.makeText(ItsTestActivity.this, "Received error from camera service while checking device capabilities: " @@ -499,14 +508,4 @@ public class ItsTestActivity extends DialogTestListActivity { setInfoResources(R.string.camera_its_test, R.string.camera_its_test_info, -1); setPassFailButtonClickListeners(); } - - @Override - public String getReportFileName() { - return MPC_TESTS_REPORT_LOG_NAME; - } - - @Override - public String getReportSectionName() { - return MPC_TESTS_REPORT_LOG_SECTION; - } } diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java index c648e8e18d9..734b4a2a780 100644 --- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java +++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java @@ -16,28 +16,24 @@ package com.android.cts.verifier.camera.its; -import android.content.Context; import android.graphics.ImageFormat; import android.graphics.Rect; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CameraMetadata; import android.hardware.camera2.CaptureRequest; -import android.hardware.camera2.CaptureResult; import android.hardware.camera2.params.MeteringRectangle; import android.hardware.camera2.params.StreamConfigurationMap; import android.media.Image; import android.media.Image.Plane; -import android.net.Uri; -import android.os.Environment; import android.os.Handler; import android.os.HandlerThread; import android.util.Log; import android.util.Size; import com.android.ex.camera2.blocking.BlockingCameraManager; -import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException; import com.android.ex.camera2.blocking.BlockingStateCallback; import org.json.JSONArray; @@ -322,6 +318,9 @@ public class ItsUtils { // Camera Id combos (ids from CameraIdList, and hidden physical camera Ids // in the form of [logical camera id]:[hidden physical camera id] public List<String> mCameraIdCombos; + // Primary rear and front camera Ids (as defined in MPC) + public String mPrimaryRearCameraId; + public String mPrimaryFrontCameraId; } public static ItsCameraIdList getItsCompatibleCameraIds(CameraManager manager) @@ -345,6 +344,18 @@ public class ItsUtils { CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE; final int LOGICAL_MULTI_CAMERA = CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA; + + final Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); + if (facing != null) { + if (facing == CameraMetadata.LENS_FACING_BACK + && outList.mPrimaryRearCameraId == null) { + outList.mPrimaryRearCameraId = id; + } else if (facing == CameraMetadata.LENS_FACING_FRONT + && outList.mPrimaryFrontCameraId == null) { + outList.mPrimaryFrontCameraId = id; + } + } + for (int capability : actualCapabilities) { if (capability == BACKWARD_COMPAT) { haveBC = true; diff --git a/tests/camera/Android.bp b/tests/camera/Android.bp index aae58c689b7..c2334fc3b4c 100644 --- a/tests/camera/Android.bp +++ b/tests/camera/Android.bp @@ -65,6 +65,7 @@ android_test { "truth-prebuilt", "androidx.heifwriter_heifwriter", "androidx.test.rules", + "MediaPerformanceClassCommon", ], jni_libs: [ "libctscamera2_jni", diff --git a/tests/camera/api31test/src/android/camera/cts/api31test/SPerfClassTest.java b/tests/camera/api31test/src/android/camera/cts/api31test/SPerfClassTest.java index feb5567963f..772e7a599cb 100644 --- a/tests/camera/api31test/src/android/camera/cts/api31test/SPerfClassTest.java +++ b/tests/camera/api31test/src/android/camera/cts/api31test/SPerfClassTest.java @@ -36,6 +36,7 @@ import android.hardware.camera2.params.SessionConfiguration; import android.hardware.camera2.TotalCaptureResult; import android.media.Image; import android.media.ImageReader; +import android.os.Build; import android.os.Handler; import android.os.HandlerThread; import android.test.AndroidTestCase; @@ -210,8 +211,9 @@ public class SPerfClassTest extends AndroidTestCase { * Version.MEDIA_PERFORMANCE_CLASS */ public void testSPerfClassJpegSizes() throws Exception { - boolean isSPerfClass = CameraTestUtils.isSPerfClass(); - if (!isSPerfClass) { + final boolean isAtLeastSPerfClass = + (Build.VERSION.MEDIA_PERFORMANCE_CLASS >= Build.VERSION_CODES.S); + if (!isAtLeastSPerfClass) { return; } diff --git a/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java b/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java index 6af7758c533..d7dd63d1ff2 100644 --- a/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java +++ b/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java @@ -55,6 +55,10 @@ import android.hardware.camera2.params.DynamicRangeProfiles; import android.hardware.camera2.params.RecommendedStreamConfigurationMap; import android.hardware.camera2.params.StreamConfigurationMap; import android.hardware.cts.helpers.CameraUtils; +import android.mediapc.cts.common.Requirement; +import android.mediapc.cts.common.RequiredMeasurement; +import android.mediapc.cts.common.RequirementConstants; +import android.mediapc.cts.common.PerformanceClassEvaluator; import android.media.CamcorderProfile; import android.media.ImageReader; import android.os.Build; @@ -74,15 +78,11 @@ import android.view.WindowMetrics; import androidx.test.rule.ActivityTestRule; -import androidx.test.InstrumentationRegistry; - import com.android.compatibility.common.util.CddTest; -import com.android.compatibility.common.util.DeviceReportLog; -import com.android.compatibility.common.util.ResultType; -import com.android.compatibility.common.util.ResultUnit; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestName; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -92,12 +92,10 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.function.BiPredicate; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static android.hardware.camera2.cts.CameraTestUtils.MPC_REPORT_LOG_NAME; -import static android.hardware.camera2.cts.CameraTestUtils.MPC_STREAM_NAME; - /** * Extended tests for static camera characteristics. */ @@ -113,6 +111,9 @@ public class ExtendedCameraCharacteristicsTest extends Camera2AndroidTestCase { */ private static final int MIN_ALLOWABLE_WHITELEVEL = 32; // must have sensor bit depth > 5 + @Rule + public final TestName mTestName = new TestName(); + private List<CameraCharacteristics> mCharacteristics; private static final Size FULLHD = new Size(1920, 1080); @@ -131,10 +132,6 @@ public class ExtendedCameraCharacteristicsTest extends Camera2AndroidTestCase { private static final long PREVIEW_RUN_MS = 500; private static final long FRAME_DURATION_30FPS_NSEC = (long) 1e9 / 30; - private static final long MIN_BACK_SENSOR_PERF_CLASS_RESOLUTION = 12000000; - private static final long MIN_FRONT_SENSOR_S_PERF_CLASS_RESOLUTION = 5000000; - private static final long MIN_FRONT_SENSOR_R_PERF_CLASS_RESOLUTION = 4000000; - private static final long MIN_UHR_SENSOR_RESOLUTION = 24000000; /* * HW Levels short hand @@ -2857,28 +2854,70 @@ public class ExtendedCameraCharacteristicsTest extends Camera2AndroidTestCase { } /** - * Update performance class level based on condition - * - * @param condition whether the condition is met for passLevel - * @param passLevel the highest performance class level when condition is true - * @param failLevel the performance class when condition is false + * Camera hardware level requirement for Media Performance Class */ - private int updatePerfClassLevel(boolean condition, int passLevel, int failLevel) { - return condition ? passLevel : failLevel; - } + public static class PrimaryCameraHwLevelReq extends Requirement { + private static final String TAG = PrimaryCameraHwLevelReq.class.getSimpleName(); + + /** + * Creates a >= predicate for camera hardware level + */ + private static BiPredicate<Integer, Integer> camHwLevelGte() { + return new BiPredicate<Integer, Integer>() { + @Override + public boolean test(Integer actual, Integer expected) { + return StaticMetadata.hardwareLevelPredicate(actual, expected); + } - /** - * Update perf class level based on meetSPerfClass and meetRPerfClass. - */ - private int updatePerfClassLevelRS(boolean meetSPerfClass, boolean meetRPerfClass, - int perfClassLevel) { - if (!meetRPerfClass) { - return CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } else if (!meetSPerfClass && - perfClassLevel > CameraTestUtils.PERFORMANCE_CLASS_R) { - return Math.min(CameraTestUtils.PERFORMANCE_CLASS_R, perfClassLevel); - } - return perfClassLevel; + @Override + public String toString() { + return "Camera Hardware Level Greater than or equal to"; + } + }; + } + private static final BiPredicate<Integer, Integer> CAM_HW_LEVEL_GTE = camHwLevelGte(); + private PrimaryCameraHwLevelReq(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setPrimaryRearCameraHwlLevel(Integer hwLevel) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_HWL_LEVEL, hwLevel); + } + + public void setPrimaryFrontCameraHwlLevel(Integer hwLevel) { + this.setMeasuredValue(RequirementConstants.FRONT_CAMERA_HWL_LEVEL, hwLevel); + } + + /** + * [2.2.7.2/7.5/H-1-3] MUST support android.info.supportedHardwareLevel property as FULL or + * better for back primary and LIMITED or better for front primary camera. + */ + public static PrimaryCameraHwLevelReq createPrimaryCameraHwLevelReq() { + RequiredMeasurement<Integer> rearCameraHwlLevel = RequiredMeasurement + .<Integer>builder() + .setId(RequirementConstants.REAR_CAMERA_HWL_LEVEL) + .setPredicate(CAM_HW_LEVEL_GTE) + .addRequiredValue(Build.VERSION_CODES.R, + CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) + .addRequiredValue(Build.VERSION_CODES.S, + CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, + CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) + .build(); + RequiredMeasurement<Integer> frontCameraHwlLevel = RequiredMeasurement + .<Integer>builder() + .setId(RequirementConstants.FRONT_CAMERA_HWL_LEVEL) + .setPredicate(CAM_HW_LEVEL_GTE) + .addRequiredValue(Build.VERSION_CODES.R, + CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED) + .addRequiredValue(Build.VERSION_CODES.S, + CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, + CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) + .build(); + return new PrimaryCameraHwLevelReq(RequirementConstants.R7_5__H_1_3, + rearCameraHwlLevel, frontCameraHwlLevel); + } } /** @@ -2893,30 +2932,31 @@ public class ExtendedCameraCharacteristicsTest extends Camera2AndroidTestCase { // ids. return; } - boolean assertRPerfClass = CameraTestUtils.isRPerfClass(); - boolean assertSPerfClass = CameraTestUtils.isSPerfClass(); - boolean assertTPerfClass = CameraTestUtils.isTPerfClass(); - boolean assertPerfClass = (assertRPerfClass || assertSPerfClass || assertTPerfClass); - - // R & S Performance Class - int perfClassLevelH11 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH12 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH13 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH14 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH18 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - - // T Performance Class - int perfClassLevelH19 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH110 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH111 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH112 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH113 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - int perfClassLevelH114 = CameraTestUtils.PERFORMANCE_CLASS_CURRENT; - - DeviceReportLog reportLog = new DeviceReportLog(MPC_REPORT_LOG_NAME, MPC_STREAM_NAME); - - String primaryRearId = null; - String primaryFrontId = null; + PerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName); + PerformanceClassEvaluator.PrimaryCameraRequirement primaryRearReq = + pce.addPrimaryRearCameraReq(); + PerformanceClassEvaluator.PrimaryCameraRequirement primaryFrontReq = + pce.addPrimaryFrontCameraReq(); + PrimaryCameraHwLevelReq hwLevelReq = pce.addRequirement( + PrimaryCameraHwLevelReq.createPrimaryCameraHwLevelReq()); + PerformanceClassEvaluator.CameraTimestampSourceRequirement timestampSourceReq = + pce.addR7_5__H_1_4(); + PerformanceClassEvaluator.CameraRawRequirement rearRawReq = + pce.addR7_5__H_1_8(); + PerformanceClassEvaluator.Camera240FpsRequirement hfrReq = + pce.addR7_5__H_1_9(); + PerformanceClassEvaluator.UltraWideZoomRatioRequirement ultrawideZoomRatioReq = + pce.addR7_5__H_1_10(); + PerformanceClassEvaluator.ConcurrentRearFrontRequirement concurrentRearFrontReq = + pce.addR7_5__H_1_11(); + PerformanceClassEvaluator.PreviewStabilizationRequirement previewStabilizationReq = + pce.addR7_5__H_1_12(); + PerformanceClassEvaluator.LogicalMultiCameraRequirement logicalMultiCameraReq = + pce.addR7_5__H_1_13(); + PerformanceClassEvaluator.StreamUseCaseRequirement streamUseCaseReq = + pce.addR7_5__H_1_14(); + + HashSet<String> primaryCameras = new HashSet<String>(); for (int i = 0; i < mCameraIdsUnderTest.length; i++) { String cameraId = mCameraIdsUnderTest[i]; boolean isPrimaryRear = CameraTestUtils.isPrimaryRearFacingCamera( @@ -2940,42 +2980,27 @@ public class ExtendedCameraCharacteristicsTest extends Camera2AndroidTestCase { List<Size> videoSizes = CameraTestUtils.getSupportedVideoSizes(cameraId, mCameraManager, null /*bound*/); + Integer timestampSource = c.get(CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE); if (isPrimaryRear) { - primaryRearId = cameraId; - if (sensorResolution < MIN_BACK_SENSOR_PERF_CLASS_RESOLUTION) { - mCollector.expectTrue("Primary rear camera resolution should be at least " + - MIN_BACK_SENSOR_PERF_CLASS_RESOLUTION + " pixels, is "+ - sensorResolution, !assertPerfClass); - perfClassLevelH11 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } - reportLog.addValue("rear camera resolution", sensorResolution, - ResultType.NEUTRAL, ResultUnit.NONE); + primaryCameras.add(cameraId); + primaryRearReq.setPrimaryCameraSupported(true); + primaryRearReq.setResolution(sensorResolution); + hwLevelReq.setPrimaryRearCameraHwlLevel(staticInfo.getHardwareLevelChecked()); + timestampSourceReq.setRearCameraTimestampSource(timestampSource); // 4K @ 30fps boolean supportUHD = videoSizes.contains(UHD); boolean supportDC4K = videoSizes.contains(DC4K); - reportLog.addValue("rear camera 4k support", supportUHD | supportDC4K, - ResultType.NEUTRAL, ResultUnit.NONE); - if (!supportUHD && !supportDC4K) { - mCollector.expectTrue("Primary rear camera should support 4k video recording", - !assertPerfClass); - perfClassLevelH11 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } else { + boolean support4K = (supportUHD || supportDC4K); + primaryRearReq.setVideoSizeReqSatisfied(support4K); + if (support4K) { long minFrameDuration = config.getOutputMinFrameDuration( android.media.MediaRecorder.class, supportDC4K ? DC4K : UHD); - reportLog.addValue("rear camera 4k frame duration", minFrameDuration, - ResultType.NEUTRAL, ResultUnit.NONE); - if (minFrameDuration >= (1e9 / 29.9)) { - mCollector.expectTrue("Primary rear camera should support 4k video @ 30fps", - !assertPerfClass); - perfClassLevelH11 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } + primaryRearReq.setVideoFps(1e9 / minFrameDuration); } // H-1-9 boolean supportHighSpeed = staticInfo.isCapabilitySupported(CONSTRAINED_HIGH_SPEED); - mCollector.expectTrue("Primary rear camera should support high speed recording", - !assertTPerfClass || supportHighSpeed); boolean support240Fps = false; if (supportHighSpeed) { Size[] availableHighSpeedSizes = config.getHighSpeedVideoSizes(); @@ -2995,101 +3020,29 @@ public class ExtendedCameraCharacteristicsTest extends Camera2AndroidTestCase { break; } } - mCollector.expectTrue("Primary rear camera should support HD or FULLHD @ 240", - !assertTPerfClass || support240Fps); } - perfClassLevelH19 = updatePerfClassLevel(support240Fps, - perfClassLevelH19, CameraTestUtils.PERFORMANCE_CLASS_S); - reportLog.addValue("rear camera 720p/1080p @ 240fps support", support240Fps, - ResultType.NEUTRAL, ResultUnit.NONE); + hfrReq.setRear240FpsSupported(support240Fps); } else { - primaryFrontId = cameraId; - if (sensorResolution < MIN_FRONT_SENSOR_S_PERF_CLASS_RESOLUTION) { - mCollector.expectTrue("Primary front camera resolution should be at least " - + MIN_FRONT_SENSOR_S_PERF_CLASS_RESOLUTION + " pixels, is " - + sensorResolution, !(assertSPerfClass || assertTPerfClass)); - perfClassLevelH12 = Math.min( - perfClassLevelH12, CameraTestUtils.PERFORMANCE_CLASS_R); - } - if (sensorResolution < MIN_FRONT_SENSOR_R_PERF_CLASS_RESOLUTION) { - mCollector.expectTrue("Primary front camera resolution should be at least " + - MIN_FRONT_SENSOR_S_PERF_CLASS_RESOLUTION + " pixels, is "+ - sensorResolution, !assertRPerfClass); - perfClassLevelH12 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } - reportLog.addValue("front camera resolution", sensorResolution, - ResultType.NEUTRAL, ResultUnit.NONE); + primaryCameras.add(cameraId); + primaryFrontReq.setPrimaryCameraSupported(true); + primaryFrontReq.setResolution(sensorResolution); + hwLevelReq.setPrimaryFrontCameraHwlLevel(staticInfo.getHardwareLevelChecked()); + timestampSourceReq.setFrontCameraTimestampSource(timestampSource); // 1080P @ 30fps boolean supportFULLHD = videoSizes.contains(FULLHD); - reportLog.addValue("front camera 1080p support", supportFULLHD, - ResultType.NEUTRAL, ResultUnit.NONE); - if (!supportFULLHD) { - mCollector.expectTrue( - "Primary front camera should support 1080P video recording", - !assertPerfClass); - perfClassLevelH12 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } else { + primaryFrontReq.setVideoSizeReqSatisfied(supportFULLHD); + if (supportFULLHD) { long minFrameDuration = config.getOutputMinFrameDuration( android.media.MediaRecorder.class, FULLHD); - if (minFrameDuration >= (1e9 / 29.9)) { - mCollector.expectTrue( - "Primary front camera should support 1080P video @ 30fps", - !assertPerfClass); - perfClassLevelH12 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } - reportLog.addValue("front camera 1080p frame duration", minFrameDuration, - ResultType.NEUTRAL, ResultUnit.NONE); + primaryFrontReq.setVideoFps(1e9 / minFrameDuration); } } - String facingString = isPrimaryRear ? "rear" : "front"; - // H-1-3 - if (assertTPerfClass || assertSPerfClass || (assertRPerfClass && isPrimaryRear)) { - mCollector.expectTrue("Primary " + facingString + - " camera should be at least FULL, but is " + - toStringHardwareLevel(staticInfo.getHardwareLevelChecked()), - staticInfo.isHardwareLevelAtLeastFull()); - } else if (assertRPerfClass) { - mCollector.expectTrue("Primary " + facingString + - " camera should be at least LIMITED, but is " + - toStringHardwareLevel(staticInfo.getHardwareLevelChecked()), - staticInfo.isHardwareLevelAtLeastLimited()); - } - - reportLog.addValue(facingString + " camera hardware level", - staticInfo.getHardwareLevelChecked(), ResultType.NEUTRAL, ResultUnit.NONE); - if (isPrimaryRear) { - perfClassLevelH13 = updatePerfClassLevel(staticInfo.isHardwareLevelAtLeastFull(), - perfClassLevelH13, CameraTestUtils.PERFORMANCE_CLASS_NOT_MET); - } else { - perfClassLevelH13 = updatePerfClassLevelRS(staticInfo.isHardwareLevelAtLeastFull(), - staticInfo.isHardwareLevelAtLeastLimited(), perfClassLevelH13); - } - - // H-1-4 - Integer timestampSource = c.get(CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE); - reportLog.addValue(facingString + " timestampSource", - timestampSource, ResultType.NEUTRAL, ResultUnit.NONE); - boolean realtimeTimestamp = (timestampSource != null && - timestampSource.equals(CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME)); - mCollector.expectTrue( - "Primary " + facingString + " camera should support real-time timestamp source", - !assertPerfClass || realtimeTimestamp); - perfClassLevelH14 = updatePerfClassLevel(realtimeTimestamp, perfClassLevelH14, - CameraTestUtils.PERFORMANCE_CLASS_NOT_MET); - // H-1-8 if (isPrimaryRear) { boolean supportRaw = staticInfo.isCapabilitySupported(RAW); - reportLog.addValue(facingString + " camera raw support", - supportRaw, ResultType.NEUTRAL, ResultUnit.NONE); - if (assertSPerfClass || assertTPerfClass) { - mCollector.expectTrue("Primary rear camera should support RAW capability", - supportRaw); - } - perfClassLevelH18 = updatePerfClassLevel(supportRaw, perfClassLevelH18, - CameraTestUtils.PERFORMANCE_CLASS_R); + rearRawReq.setRearRawSupported(supportRaw); } // H-1-10 @@ -3098,96 +3051,45 @@ public class ExtendedCameraCharacteristicsTest extends Camera2AndroidTestCase { Range<Float> zoomRatioRange = staticInfo.getZoomRatioRangeChecked(); boolean meetH110 = (primaryToMaxFovRatio >= 1.0f - FOV_THRESHOLD) || (zoomRatioRange.getLower() < 1.0f - FOV_THRESHOLD); - mCollector.expectTrue("Primary " + facingString + " camera must support zoomRatio < " - + "1.0f if there is an ultrawide lens with the same facing", - !assertTPerfClass || meetH110); - perfClassLevelH110 = updatePerfClassLevel(meetH110, perfClassLevelH110, - CameraTestUtils.PERFORMANCE_CLASS_S); - reportLog.addValue(facingString + " camera supports maximum FOV using zoom ratio", - meetH110, ResultType.NEUTRAL, ResultUnit.NONE); + if (isPrimaryRear) { + ultrawideZoomRatioReq.setRearUltraWideZoomRatioReqMet(meetH110); + } else { + ultrawideZoomRatioReq.setFrontUltraWideZoomRatioReqMet(meetH110); + } // H-1-12 - boolean meetH112 = staticInfo.isPreviewStabilizationSupported(); - mCollector.expectTrue("Primary " + facingString + " camera must support preview " - + "stabilization", !assertTPerfClass || meetH112); - perfClassLevelH112 = updatePerfClassLevel(meetH112, perfClassLevelH112, - CameraTestUtils.PERFORMANCE_CLASS_S); - reportLog.addValue(facingString + " camera preview stabilization", meetH112, - ResultType.NEUTRAL, ResultUnit.NONE); + boolean previewStab = staticInfo.isPreviewStabilizationSupported(); + if (isPrimaryRear) { + previewStabilizationReq.setRearPreviewStabilizationSupported(previewStab); + } else { + previewStabilizationReq.setFrontPreviewStabilizationSupported(previewStab); + } // H-1-13 int facing = staticInfo.getLensFacingChecked(); int numOfPhysicalRgbCameras = getNumberOfRgbPhysicalCameras(facing); - boolean meetH113 = (numOfPhysicalRgbCameras <= 1) || staticInfo.isLogicalMultiCamera(); - mCollector.expectTrue("Primary " + facingString + " camera must be LOGICAL_MULTI_CAMERA" - + " in case of multiple RGB cameras with same facing", - !assertTPerfClass || meetH113); - perfClassLevelH113 = updatePerfClassLevel(meetH113, perfClassLevelH113, - CameraTestUtils.PERFORMANCE_CLASS_S); - reportLog.addValue(facingString + " camera is LOGICAL_MULTI_CAMERA in case of multiple " - + "RGB cameras with same facing", meetH113, ResultType.NEUTRAL, - ResultUnit.NONE); + boolean logicalMultiCameraReqMet = + (numOfPhysicalRgbCameras <= 1) || staticInfo.isLogicalMultiCamera(); + if (isPrimaryRear) { + logicalMultiCameraReq.setRearLogicalMultiCameraReqMet(logicalMultiCameraReqMet); + } else { + logicalMultiCameraReq.setFrontLogicalMultiCameraReqMet(logicalMultiCameraReqMet); + } // H-1-14 - boolean meetH114 = staticInfo.isStreamUseCaseSupported(); - mCollector.expectTrue("Primary " + facingString + " camera must support stream " - + "use case", !assertTPerfClass || meetH114); - perfClassLevelH114 = updatePerfClassLevel(meetH114, perfClassLevelH114, - CameraTestUtils.PERFORMANCE_CLASS_S); - reportLog.addValue(facingString + " camera stream use case", meetH114, - ResultType.NEUTRAL, ResultUnit.NONE); - } - HashSet<String> primaryCameras = new HashSet<String>(); - if (primaryRearId == null) { - mCollector.expectTrue("There must be a primary rear camera for performance class.", - !assertPerfClass); - perfClassLevelH11 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } else { - primaryCameras.add(primaryRearId); - } - if (primaryFrontId == null) { - mCollector.expectTrue("There must be a primary front camera for performance class.", - !assertPerfClass); - perfClassLevelH12 = CameraTestUtils.PERFORMANCE_CLASS_NOT_MET; - } else { - primaryCameras.add(primaryFrontId); + boolean streamUseCaseSupported = staticInfo.isStreamUseCaseSupported(); + if (isPrimaryRear) { + streamUseCaseReq.setRearStreamUseCaseSupported(streamUseCaseSupported); + } else { + streamUseCaseReq.setFrontStreamUseCaseSupported(streamUseCaseSupported); + } } - // H-1-11 Set<Set<String>> concurrentCameraIds = mCameraManager.getConcurrentCameraIds(); boolean supportPrimaryFrontBack = concurrentCameraIds.contains(primaryCameras); - mCollector.expectTrue("Concurrent primary front and primary back streaming must be " - + "supported", !assertTPerfClass || supportPrimaryFrontBack); - perfClassLevelH111 = updatePerfClassLevel(supportPrimaryFrontBack, - perfClassLevelH111, CameraTestUtils.PERFORMANCE_CLASS_S); - reportLog.addValue("concurrent front back support", supportPrimaryFrontBack, - ResultType.NEUTRAL, ResultUnit.NONE); - - reportLog.addValue("Version", "0.0.1", ResultType.NEUTRAL, ResultUnit.NONE); - final String PERF_CLASS_REQ_NUM_PREFIX = "2.2.7.2/7.5/"; - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-1", - perfClassLevelH11, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-2", - perfClassLevelH12, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-3", - perfClassLevelH13, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-4", - perfClassLevelH14, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-8", - perfClassLevelH18, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-9", - perfClassLevelH19, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-10", - perfClassLevelH110, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-11", - perfClassLevelH111, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-12", - perfClassLevelH112, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-13", - perfClassLevelH113, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.addValue(PERF_CLASS_REQ_NUM_PREFIX + "H-1-14", - perfClassLevelH114, ResultType.NEUTRAL, ResultUnit.NONE); - reportLog.submit(InstrumentationRegistry.getInstrumentation()); + concurrentRearFrontReq.setConcurrentRearFrontSupported(supportPrimaryFrontBack); + + pce.submitAndCheck(); } /** diff --git a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java index e8d616880e7..4a86b49e51a 100644 --- a/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java +++ b/tests/camera/utils/src/android/hardware/camera2/cts/CameraTestUtils.java @@ -142,8 +142,6 @@ public class CameraTestUtils extends Assert { public static final String OFFLINE_CAMERA_ID = "offline_camera_id"; public static final String REPORT_LOG_NAME = "CtsCameraTestCases"; - public static final String MPC_REPORT_LOG_NAME = "MediaPerformanceClassLogs"; - public static final String MPC_STREAM_NAME = "CameraCts"; private static final int EXIF_DATETIME_LENGTH = 19; private static final int EXIF_DATETIME_ERROR_MARGIN_SEC = 60; @@ -3815,33 +3813,6 @@ public class CameraTestUtils extends Assert { return zoomRatios; } - public static final int PERFORMANCE_CLASS_NOT_MET = 0; - public static final int PERFORMANCE_CLASS_R = Build.VERSION_CODES.R; - public static final int PERFORMANCE_CLASS_S = Build.VERSION_CODES.R + 1; - public static final int PERFORMANCE_CLASS_T = Build.VERSION_CODES.S + 2; - public static final int PERFORMANCE_CLASS_CURRENT = PERFORMANCE_CLASS_T; - - /** - * Check whether this mobile device is R performance class as defined in CDD - */ - public static boolean isRPerfClass() { - return Build.VERSION.MEDIA_PERFORMANCE_CLASS == PERFORMANCE_CLASS_R; - } - - /** - * Check whether this mobile device is S performance class as defined in CDD - */ - public static boolean isSPerfClass() { - return Build.VERSION.MEDIA_PERFORMANCE_CLASS == PERFORMANCE_CLASS_S; - } - - /** - * Check whether this mobile device is T performance class as defined in CDD - */ - public static boolean isTPerfClass() { - return Build.VERSION.MEDIA_PERFORMANCE_CLASS == PERFORMANCE_CLASS_T; - } - /** * Check whether a camera Id is a primary rear facing camera */ diff --git a/tests/camera/utils/src/android/hardware/camera2/cts/helpers/StaticMetadata.java b/tests/camera/utils/src/android/hardware/camera2/cts/helpers/StaticMetadata.java index fc8c4db5164..f1886859d67 100644 --- a/tests/camera/utils/src/android/hardware/camera2/cts/helpers/StaticMetadata.java +++ b/tests/camera/utils/src/android/hardware/camera2/cts/helpers/StaticMetadata.java @@ -229,6 +229,13 @@ public class StaticMetadata { * at least the desired one (but could be higher) */ public boolean isHardwareLevelAtLeast(int level) { + int deviceLevel = getHardwareLevelChecked(); + + return hardwareLevelPredicate(deviceLevel, level); + } + + // Return true if level1 is at least level2 + public static boolean hardwareLevelPredicate(int level1, int level2) { final int[] sortedHwLevels = { CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL, @@ -236,19 +243,19 @@ public class StaticMetadata { CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL, CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3 }; - int deviceLevel = getHardwareLevelChecked(); - if (level == deviceLevel) { + + if (level1 == level2) { return true; } for (int sortedlevel : sortedHwLevels) { - if (sortedlevel == level) { + if (sortedlevel == level2) { return true; - } else if (sortedlevel == deviceLevel) { + } else if (sortedlevel == level1) { return false; } } - Assert.fail("Unknown hardwareLevel " + level + " and device hardware level " + deviceLevel); + Assert.fail("Unknown hardwareLevel " + level1 + " and device hardware level " + level2); return false; } diff --git a/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java b/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java index 327fb9cf6c9..d3fd2921d5a 100644 --- a/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java +++ b/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assume.assumeTrue; +import android.hardware.camera2.CameraMetadata; import android.media.MediaFormat; import android.os.Build; @@ -849,7 +850,493 @@ public class PerformanceClassEvaluator { } } - private <R extends Requirement> R addRequirement(R req) { + public static class PrimaryCameraRequirement extends Requirement { + private static final long MIN_BACK_SENSOR_PERF_CLASS_RESOLUTION = 12000000; + private static final long MIN_FRONT_SENSOR_S_PERF_CLASS_RESOLUTION = 5000000; + private static final long MIN_FRONT_SENSOR_R_PERF_CLASS_RESOLUTION = 4000000; + private static final String TAG = PrimaryCameraRequirement.class.getSimpleName(); + + private PrimaryCameraRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setPrimaryCameraSupported(boolean hasPrimaryCamera) { + this.setMeasuredValue(RequirementConstants.PRIMARY_CAMERA_AVAILABLE, + hasPrimaryCamera); + } + + public void setResolution(long resolution) { + this.setMeasuredValue(RequirementConstants.PRIMARY_CAMERA_RESOLUTION, + resolution); + } + + public void setVideoSizeReqSatisfied(boolean videoSizeReqSatisfied) { + this.setMeasuredValue(RequirementConstants.PRIMARY_CAMERA_VIDEO_SIZE_REQ_SATISFIED, + videoSizeReqSatisfied); + } + + public void setVideoFps(double videoFps) { + this.setMeasuredValue(RequirementConstants.PRIMARY_CAMERA_VIDEO_FPS, videoFps); + } + + /** + * [2.2.7.2/7.5/H-1-1] MUST have a primary rear facing camera with a resolution of at + * least 12 megapixels supporting video capture at 4k@30fps + */ + public static PrimaryCameraRequirement createRearPrimaryCamera() { + RequiredMeasurement<Boolean> hasPrimaryCamera = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_AVAILABLE) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.R, true) + .addRequiredValue(Build.VERSION_CODES.S, true) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + RequiredMeasurement<Long> cameraResolution = RequiredMeasurement + .<Long>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_RESOLUTION) + .setPredicate(RequirementConstants.LONG_GTE) + .addRequiredValue(Build.VERSION_CODES.R, MIN_BACK_SENSOR_PERF_CLASS_RESOLUTION) + .addRequiredValue(Build.VERSION_CODES.S, MIN_BACK_SENSOR_PERF_CLASS_RESOLUTION) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, MIN_BACK_SENSOR_PERF_CLASS_RESOLUTION) + .build(); + + RequiredMeasurement<Boolean> videoSizeReqSatisfied = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_VIDEO_SIZE_REQ_SATISFIED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.R, true) + .addRequiredValue(Build.VERSION_CODES.S, true) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + RequiredMeasurement<Double> videoFps = RequiredMeasurement + .<Double>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_VIDEO_FPS) + .setPredicate(RequirementConstants.DOUBLE_GTE) + .addRequiredValue(Build.VERSION_CODES.R, 29.9) + .addRequiredValue(Build.VERSION_CODES.S, 29.9) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 29.9) + .build(); + + return new PrimaryCameraRequirement(RequirementConstants.R7_5__H_1_1, + hasPrimaryCamera, cameraResolution, videoSizeReqSatisfied, + videoFps); + } + + /** + * [2.2.7.2/7.5/H-1-2] MUST have a primary front facing camera with a resolution of + * at least 4 megapixels supporting video capture at 1080p@30fps. + */ + public static PrimaryCameraRequirement createFrontPrimaryCamera() { + RequiredMeasurement<Boolean> hasPrimaryCamera = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_AVAILABLE) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.R, true) + .addRequiredValue(Build.VERSION_CODES.S, true) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + RequiredMeasurement<Long> cameraResolution = RequiredMeasurement + .<Long>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_RESOLUTION) + .setPredicate(RequirementConstants.LONG_GTE) + .addRequiredValue(Build.VERSION_CODES.R, MIN_FRONT_SENSOR_R_PERF_CLASS_RESOLUTION) + .addRequiredValue(Build.VERSION_CODES.S, MIN_FRONT_SENSOR_S_PERF_CLASS_RESOLUTION) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, + MIN_FRONT_SENSOR_S_PERF_CLASS_RESOLUTION) + .build(); + + RequiredMeasurement<Boolean> videoSizeReqSatisfied = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_VIDEO_SIZE_REQ_SATISFIED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.R, true) + .addRequiredValue(Build.VERSION_CODES.S, true) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + RequiredMeasurement<Double> videoFps = RequiredMeasurement + .<Double>builder() + .setId(RequirementConstants.PRIMARY_CAMERA_VIDEO_FPS) + .setPredicate(RequirementConstants.DOUBLE_GTE) + .addRequiredValue(Build.VERSION_CODES.R, 29.9) + .addRequiredValue(Build.VERSION_CODES.S, 29.9) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 29.9) + .build(); + + return new PrimaryCameraRequirement(RequirementConstants.R7_5__H_1_2, + hasPrimaryCamera, cameraResolution, videoSizeReqSatisfied, + videoFps); + } + } + + public static class CameraTimestampSourceRequirement extends Requirement { + private static final String TAG = CameraTimestampSourceRequirement.class.getSimpleName(); + private static final int TIMESTAMP_REALTIME = + CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME; + + private CameraTimestampSourceRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRearCameraTimestampSource(Integer timestampSource) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_TIMESTAMP_SOURCE, + timestampSource); + } + + public void setFrontCameraTimestampSource(Integer timestampSource) { + this.setMeasuredValue(RequirementConstants.FRONT_CAMERA_TIMESTAMP_SOURCE, + timestampSource); + } + /** + * [2.2.7.2/7.5/H-1-4] MUST support CameraMetadata.SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME + * for both primary cameras. + */ + public static CameraTimestampSourceRequirement createTimestampSourceReq() { + RequiredMeasurement<Integer> rearTimestampSource = RequiredMeasurement + .<Integer>builder() + .setId(RequirementConstants.REAR_CAMERA_TIMESTAMP_SOURCE) + .setPredicate(RequirementConstants.INTEGER_EQ) + .addRequiredValue(Build.VERSION_CODES.R, TIMESTAMP_REALTIME) + .addRequiredValue(Build.VERSION_CODES.S, TIMESTAMP_REALTIME) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, TIMESTAMP_REALTIME) + .build(); + RequiredMeasurement<Integer> frontTimestampSource = RequiredMeasurement + .<Integer>builder() + .setId(RequirementConstants.FRONT_CAMERA_TIMESTAMP_SOURCE) + .setPredicate(RequirementConstants.INTEGER_EQ) + .addRequiredValue(Build.VERSION_CODES.R, TIMESTAMP_REALTIME) + .addRequiredValue(Build.VERSION_CODES.S, TIMESTAMP_REALTIME) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, TIMESTAMP_REALTIME) + .build(); + + return new CameraTimestampSourceRequirement(RequirementConstants.R7_5__H_1_4, + rearTimestampSource, frontTimestampSource); + } + } + + public static class CameraLatencyRequirement extends Requirement { + private static final String TAG = CameraTimestampSourceRequirement.class.getSimpleName(); + + private CameraLatencyRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRearCameraLatency(float latency) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_LATENCY, latency); + } + + public void setFrontCameraLatency(float latency) { + this.setMeasuredValue(RequirementConstants.FRONT_CAMERA_LATENCY, latency); + } + + /** + * [2.2.7.2/7.5/H-1-5] MUST have camera2 JPEG capture latency < 1000ms for 1080p resolution + * as measured by the CTS camera PerformanceTest under ITS lighting conditions + * (3000K) for both primary cameras. + */ + public static CameraLatencyRequirement createJpegLatencyReq() { + RequiredMeasurement<Float> rearJpegLatency = RequiredMeasurement + .<Float>builder() + .setId(RequirementConstants.REAR_CAMERA_LATENCY) + .setPredicate(RequirementConstants.FLOAT_LTE) + .addRequiredValue(Build.VERSION_CODES.R, 1000.0f) + .addRequiredValue(Build.VERSION_CODES.S, 1000.0f) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 1000.0f) + .build(); + RequiredMeasurement<Float> frontJpegLatency = RequiredMeasurement + .<Float>builder() + .setId(RequirementConstants.FRONT_CAMERA_LATENCY) + .setPredicate(RequirementConstants.FLOAT_LTE) + .addRequiredValue(Build.VERSION_CODES.R, 1000.0f) + .addRequiredValue(Build.VERSION_CODES.S, 1000.0f) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 1000.0f) + .build(); + + return new CameraLatencyRequirement(RequirementConstants.R7_5__H_1_5, + rearJpegLatency, frontJpegLatency); + } + + /** + * [2.2.7.2/7.5/H-1-6] MUST have camera2 startup latency (open camera to first + * preview frame) < 600ms as measured by the CTS camera PerformanceTest under ITS lighting + * conditions (3000K) for both primary cameras. + */ + public static CameraLatencyRequirement createLaunchLatencyReq() { + RequiredMeasurement<Float> rearLaunchLatency = RequiredMeasurement + .<Float>builder() + .setId(RequirementConstants.REAR_CAMERA_LATENCY) + .setPredicate(RequirementConstants.FLOAT_LTE) + .addRequiredValue(Build.VERSION_CODES.R, 600.0f) + .addRequiredValue(Build.VERSION_CODES.S, 600.0f) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 600.0f) + .build(); + RequiredMeasurement<Float> frontLaunchLatency = RequiredMeasurement + .<Float>builder() + .setId(RequirementConstants.FRONT_CAMERA_LATENCY) + .setPredicate(RequirementConstants.FLOAT_LTE) + .addRequiredValue(Build.VERSION_CODES.R, 600.0f) + .addRequiredValue(Build.VERSION_CODES.S, 600.0f) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 600.0f) + .build(); + + return new CameraLatencyRequirement(RequirementConstants.R7_5__H_1_6, + rearLaunchLatency, frontLaunchLatency); + } + } + + public static class CameraRawRequirement extends Requirement { + private static final String TAG = CameraRawRequirement.class.getSimpleName(); + + private CameraRawRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRearRawSupported(boolean rearRawSupported) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_RAW_SUPPORTED, + rearRawSupported); + } + + /** + * [2.2.7.2/7.5/H-1-8] MUST support CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_RAW and + * android.graphics.ImageFormat.RAW_SENSOR for the primary back camera. + */ + public static CameraRawRequirement createRawReq() { + RequiredMeasurement<Boolean> requirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.REAR_CAMERA_RAW_SUPPORTED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.S, true) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + return new CameraRawRequirement(RequirementConstants.R7_5__H_1_8, requirement); + } + } + + public static class Camera240FpsRequirement extends Requirement { + private static final String TAG = Camera240FpsRequirement.class.getSimpleName(); + + private Camera240FpsRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRear240FpsSupported(boolean rear240FpsSupported) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_240FPS_SUPPORTED, + rear240FpsSupported); + } + + /** + * [2.2.7.2/7.5/H-1-9] MUST have a rear-facing primary camera supporting 720p or 1080p @ 240fps. + */ + public static Camera240FpsRequirement create240FpsReq() { + RequiredMeasurement<Boolean> requirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.REAR_CAMERA_240FPS_SUPPORTED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + return new Camera240FpsRequirement(RequirementConstants.R7_5__H_1_9, requirement); + } + } + + public static class UltraWideZoomRatioRequirement extends Requirement { + private static final String TAG = + UltraWideZoomRatioRequirement.class.getSimpleName(); + + private UltraWideZoomRatioRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRearUltraWideZoomRatioReqMet(boolean ultrawideZoomRatioReqMet) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_ULTRAWIDE_ZOOMRATIO_REQ_MET, + ultrawideZoomRatioReqMet); + } + + public void setFrontUltraWideZoomRatioReqMet(boolean ultrawideZoomRatioReqMet) { + this.setMeasuredValue(RequirementConstants.FRONT_CAMERA_ULTRAWIDE_ZOOMRATIO_REQ_MET, + ultrawideZoomRatioReqMet); + } + + /** + * [2.2.7.2/7.5/H-1-10] MUST have min ZOOM_RATIO < 1.0 for the primary cameras if + * there is an ultrawide RGB camera facing the same direction. + */ + public static UltraWideZoomRatioRequirement createUltrawideZoomRatioReq() { + RequiredMeasurement<Boolean> rearRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.REAR_CAMERA_ULTRAWIDE_ZOOMRATIO_REQ_MET) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + RequiredMeasurement<Boolean> frontRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.FRONT_CAMERA_ULTRAWIDE_ZOOMRATIO_REQ_MET) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + return new UltraWideZoomRatioRequirement(RequirementConstants.R7_5__H_1_10, + rearRequirement, frontRequirement); + } + } + + public static class ConcurrentRearFrontRequirement extends Requirement { + private static final String TAG = ConcurrentRearFrontRequirement.class.getSimpleName(); + + private ConcurrentRearFrontRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setConcurrentRearFrontSupported(boolean concurrentRearFrontSupported) { + this.setMeasuredValue(RequirementConstants.CONCURRENT_REAR_FRONT_SUPPORTED, + concurrentRearFrontSupported); + } + + /** + * [2.2.7.2/7.5/H-1-11] MUST implement concurrent front-back streaming on primary cameras. + */ + public static ConcurrentRearFrontRequirement createConcurrentRearFrontReq() { + RequiredMeasurement<Boolean> requirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.CONCURRENT_REAR_FRONT_SUPPORTED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + return new ConcurrentRearFrontRequirement(RequirementConstants.R7_5__H_1_11, + requirement); + } + } + + public static class PreviewStabilizationRequirement extends Requirement { + private static final String TAG = + PreviewStabilizationRequirement.class.getSimpleName(); + + private PreviewStabilizationRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRearPreviewStabilizationSupported(boolean supported) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_PREVIEW_STABILIZATION_SUPPORTED, + supported); + } + + public void setFrontPreviewStabilizationSupported(boolean supported) { + this.setMeasuredValue(RequirementConstants.FRONT_CAMERA_PREVIEW_STABILIZATION_SUPPORTED, + supported); + } + + /** + * [2.2.7.2/7.5/H-1-12] MUST support CONTROL_VIDEO_STABILIZATION_MODE_PREVIEW_STABILIZATION + * for both primary front and primary back camera. + */ + public static PreviewStabilizationRequirement createPreviewStabilizationReq() { + RequiredMeasurement<Boolean> rearRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.REAR_CAMERA_PREVIEW_STABILIZATION_SUPPORTED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + RequiredMeasurement<Boolean> frontRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.FRONT_CAMERA_PREVIEW_STABILIZATION_SUPPORTED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + return new PreviewStabilizationRequirement(RequirementConstants.R7_5__H_1_12, + rearRequirement, frontRequirement); + } + } + + public static class LogicalMultiCameraRequirement extends Requirement { + private static final String TAG = + LogicalMultiCameraRequirement.class.getSimpleName(); + + private LogicalMultiCameraRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRearLogicalMultiCameraReqMet(boolean reqMet) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_LOGICAL_MULTI_CAMERA_REQ_MET, + reqMet); + } + + public void setFrontLogicalMultiCameraReqMet(boolean reqMet) { + this.setMeasuredValue(RequirementConstants.FRONT_CAMERA_LOGICAL_MULTI_CAMERA_REQ_MET, + reqMet); + } + + /** + * [2.2.7.2/7.5/H-1-13] MUST support LOGICAL_MULTI_CAMERA capability for the primary + * cameras if there are greater than 1 RGB cameras facing the same direction. + */ + public static LogicalMultiCameraRequirement createLogicalMultiCameraReq() { + RequiredMeasurement<Boolean> rearRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.REAR_CAMERA_LOGICAL_MULTI_CAMERA_REQ_MET) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + RequiredMeasurement<Boolean> frontRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.FRONT_CAMERA_LOGICAL_MULTI_CAMERA_REQ_MET) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + return new LogicalMultiCameraRequirement(RequirementConstants.R7_5__H_1_13, + rearRequirement, frontRequirement); + } + } + + public static class StreamUseCaseRequirement extends Requirement { + private static final String TAG = + StreamUseCaseRequirement.class.getSimpleName(); + + private StreamUseCaseRequirement(String id, RequiredMeasurement<?> ... reqs) { + super(id, reqs); + } + + public void setRearStreamUseCaseSupported(boolean supported) { + this.setMeasuredValue(RequirementConstants.REAR_CAMERA_STREAM_USECASE_SUPPORTED, + supported); + } + + public void setFrontStreamUseCaseSupported(boolean supported) { + this.setMeasuredValue(RequirementConstants.FRONT_CAMERA_STREAM_USECASE_SUPPORTED, + supported); + } + + /** + * [2.2.7.2/7.5/H-1-14] MUST support STREAM_USE_CASE capability for both primary + * front and primary back camera. + */ + public static StreamUseCaseRequirement createStreamUseCaseReq() { + RequiredMeasurement<Boolean> rearRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.REAR_CAMERA_STREAM_USECASE_SUPPORTED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + RequiredMeasurement<Boolean> frontRequirement = RequiredMeasurement + .<Boolean>builder() + .setId(RequirementConstants.FRONT_CAMERA_STREAM_USECASE_SUPPORTED) + .setPredicate(RequirementConstants.BOOLEAN_EQ) + .addRequiredValue(Build.VERSION_CODES.TIRAMISU, true) + .build(); + + return new StreamUseCaseRequirement(RequirementConstants.R7_5__H_1_14, + rearRequirement, frontRequirement); + } + } + + public <R extends Requirement> R addRequirement(R req) { if (!this.mRequirements.add(req)) { throw new IllegalStateException("Requirement " + req.id() + " already added"); } @@ -1000,16 +1487,69 @@ public class PerformanceClassEvaluator { return this.addRequirement(ConcurrentCodecRequirement.createR5_1__H_1_10()); } + public PrimaryCameraRequirement addPrimaryRearCameraReq() { + return this.addRequirement(PrimaryCameraRequirement.createRearPrimaryCamera()); + } + + public PrimaryCameraRequirement addPrimaryFrontCameraReq() { + return this.addRequirement(PrimaryCameraRequirement.createFrontPrimaryCamera()); + } + + public CameraTimestampSourceRequirement addR7_5__H_1_4() { + return this.addRequirement(CameraTimestampSourceRequirement.createTimestampSourceReq()); + } + + public CameraLatencyRequirement addR7_5__H_1_5() { + return this.addRequirement(CameraLatencyRequirement.createJpegLatencyReq()); + } + + public CameraLatencyRequirement addR7_5__H_1_6() { + return this.addRequirement(CameraLatencyRequirement.createLaunchLatencyReq()); + } + + public CameraRawRequirement addR7_5__H_1_8() { + return this.addRequirement(CameraRawRequirement.createRawReq()); + } + + public Camera240FpsRequirement addR7_5__H_1_9() { + return this.addRequirement(Camera240FpsRequirement.create240FpsReq()); + } + + public UltraWideZoomRatioRequirement addR7_5__H_1_10() { + return this.addRequirement(UltraWideZoomRatioRequirement.createUltrawideZoomRatioReq()); + } + + public ConcurrentRearFrontRequirement addR7_5__H_1_11() { + return this.addRequirement(ConcurrentRearFrontRequirement.createConcurrentRearFrontReq()); + } + + public PreviewStabilizationRequirement addR7_5__H_1_12() { + return this.addRequirement(PreviewStabilizationRequirement.createPreviewStabilizationReq()); + } + + public LogicalMultiCameraRequirement addR7_5__H_1_13() { + return this.addRequirement(LogicalMultiCameraRequirement.createLogicalMultiCameraReq()); + } + + public StreamUseCaseRequirement addR7_5__H_1_14() { + return this.addRequirement(StreamUseCaseRequirement.createStreamUseCaseReq()); + } + public void submitAndCheck() { - boolean perfClassMet = true; - for (Requirement req: this.mRequirements) { - perfClassMet &= req.writeLogAndCheck(this.mTestName); - } + boolean perfClassMet = submit(); // check performance class assumeTrue("Build.VERSION.MEDIA_PERFORMANCE_CLASS is not declared", Utils.isPerfClass()); assertThat(perfClassMet).isTrue(); + } + public boolean submit() { + boolean perfClassMet = true; + for (Requirement req: this.mRequirements) { + perfClassMet &= req.writeLogAndCheck(this.mTestName); + } this.mRequirements.clear(); // makes sure report isn't submitted twice + return perfClassMet; } + } diff --git a/tests/mediapc/common/src/android/mediapc/cts/common/RequirementConstants.java b/tests/mediapc/common/src/android/mediapc/cts/common/RequirementConstants.java index d93cb2e0a00..ad0d0d5694f 100644 --- a/tests/mediapc/common/src/android/mediapc/cts/common/RequirementConstants.java +++ b/tests/mediapc/common/src/android/mediapc/cts/common/RequirementConstants.java @@ -16,8 +16,6 @@ package android.mediapc.cts.common; -import android.os.Build; - import java.util.function.BiPredicate; public class RequirementConstants { @@ -54,8 +52,13 @@ public class RequirementConstants { public static final String R7_5__H_1_4 = "r7_5__h_1_4"; // 7.5/H-1-4 public static final String R7_5__H_1_5 = "r7_5__h_1_5"; // 7.5/H-1-5 public static final String R7_5__H_1_6 = "r7_5__h_1_6"; // 7.5/H-1-6 - public static final String R7_5__H_1_7 = "r7_5__h_1_7"; // 7.5/H-1-7 public static final String R7_5__H_1_8 = "r7_5__h_1_8"; // 7.5/H-1-8 + public static final String R7_5__H_1_9 = "r7_5__h_1_9"; // 7.5/H-1-9 + public static final String R7_5__H_1_10 = "r7_5__h_1_10"; // 7.5/H-1-10 + public static final String R7_5__H_1_11 = "r7_5__h_1_11"; // 7.5/H-1-11 + public static final String R7_5__H_1_12 = "r7_5__h_1_12"; // 7.5/H-1-12 + public static final String R7_5__H_1_13 = "r7_5__h_1_13"; // 7.5/H-1-13 + public static final String R7_5__H_1_14 = "r7_5__h_1_14"; // 7.5/H-1-14 public static final String R7_1_1_1__H_1_1 = "r7_1_1_1__h_1_1"; // 7.1.1.1/H-1-1 public static final String R7_1_1_3__H_1_1 = "r7_1_1_3__h_1_1"; // 7.1.1.3/H-1-1 public static final String R7_6_1__H_1_1 = "r7_6_1__h_1_1"; // 7.6.1/H-1-1 @@ -90,14 +93,50 @@ public class RequirementConstants { public static final String NUM_CRYPTO_HW_SECURE_ALL_SUPPORT = "number_crypto_hw_secure_all_support"; + public static final String PRIMARY_CAMERA_AVAILABLE = "primary_camera_available"; + public static final String PRIMARY_CAMERA_RESOLUTION = "primary_camera_resolution"; + public static final String PRIMARY_CAMERA_VIDEO_SIZE_REQ_SATISFIED = + "primary_camera_video_size_req_satisfied"; + public static final String PRIMARY_CAMERA_VIDEO_FPS = + "primary_camera_video_fps"; + public static final String REAR_CAMERA_HWL_LEVEL = "rear_primary_camera_hwl_level"; + public static final String FRONT_CAMERA_HWL_LEVEL = "front_primary_camera_hwl_level"; + public static final String REAR_CAMERA_TIMESTAMP_SOURCE = + "rear_primary_camera_timestamp_source"; + public static final String FRONT_CAMERA_TIMESTAMP_SOURCE = + "front_primary_camera_timestamp_source"; + public static final String REAR_CAMERA_LATENCY = "rear_camera_latency"; + public static final String FRONT_CAMERA_LATENCY = "front_camera_latency"; + public static final String REAR_CAMERA_RAW_SUPPORTED = "rear_camera_raw_supported"; + public static final String REAR_CAMERA_240FPS_SUPPORTED = "rear_camera_240fps_supported"; + public static final String REAR_CAMERA_ULTRAWIDE_ZOOMRATIO_REQ_MET = + "rear_camera_ultrawide_zoom_req_met"; + public static final String FRONT_CAMERA_ULTRAWIDE_ZOOMRATIO_REQ_MET = + "front_camera_ultrawide_zoom_req_met"; + public static final String CONCURRENT_REAR_FRONT_SUPPORTED = "rear_front_concurrent_camera"; + public static final String REAR_CAMERA_PREVIEW_STABILIZATION_SUPPORTED = + "rear_camera_preview_stabilization_supported"; + public static final String FRONT_CAMERA_PREVIEW_STABILIZATION_SUPPORTED = + "front_camera_preview_stabilization_supported"; + public static final String REAR_CAMERA_LOGICAL_MULTI_CAMERA_REQ_MET = + "rear_camera_logical_multi_camera_req_met"; + public static final String FRONT_CAMERA_LOGICAL_MULTI_CAMERA_REQ_MET = + "front_camera_logical_multi_camera_req_met"; + public static final String REAR_CAMERA_STREAM_USECASE_SUPPORTED = + "rear_camera_stream_usecase_supported"; + public static final String FRONT_CAMERA_STREAM_USECASE_SUPPORTED = + "front_camera_stream_usecase_supported"; + public enum Result { NA, MET, UNMET } public static final BiPredicate<Long, Long> LONG_GTE = RequirementConstants.gte(); public static final BiPredicate<Long, Long> LONG_LTE = RequirementConstants.lte(); + public static final BiPredicate<Float, Float> FLOAT_LTE = RequirementConstants.lte(); public static final BiPredicate<Integer, Integer> INTEGER_GTE = RequirementConstants.gte(); public static final BiPredicate<Integer, Integer> INTEGER_LTE = RequirementConstants.lte(); + public static final BiPredicate<Integer, Integer> INTEGER_EQ = RequirementConstants.eq(); public static final BiPredicate<Double, Double> DOUBLE_EQ = RequirementConstants.eq(); public static final BiPredicate<Boolean, Boolean> BOOLEAN_EQ = RequirementConstants.eq(); public static final BiPredicate<Double, Double> DOUBLE_GTE = RequirementConstants.gte(); diff --git a/tests/mediapc/common/src/android/mediapc/cts/common/Utils.java b/tests/mediapc/common/src/android/mediapc/cts/common/Utils.java index ac03705a1a2..28a122b4521 100644 --- a/tests/mediapc/common/src/android/mediapc/cts/common/Utils.java +++ b/tests/mediapc/common/src/android/mediapc/cts/common/Utils.java @@ -73,16 +73,24 @@ public class Utils { Context context = InstrumentationRegistry.getInstrumentation().getContext(); DisplayMetrics metrics = new DisplayMetrics(); - WindowManager windowManager = context.getSystemService(WindowManager.class); - windowManager.getDefaultDisplay().getMetrics(metrics); - DISPLAY_DPI = metrics.densityDpi; - DISPLAY_LONG_PIXELS = Math.max(metrics.widthPixels, metrics.heightPixels); - DISPLAY_SHORT_PIXELS = Math.min(metrics.widthPixels, metrics.heightPixels); - - ActivityManager activityManager = context.getSystemService(ActivityManager.class); - ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); - activityManager.getMemoryInfo(memoryInfo); - TOTAL_MEMORY_MB = memoryInfo.totalMem / 1024 / 1024; + // When used from ItsService, context will be null + if (context != null) { + WindowManager windowManager = context.getSystemService(WindowManager.class); + windowManager.getDefaultDisplay().getMetrics(metrics); + DISPLAY_DPI = metrics.densityDpi; + DISPLAY_LONG_PIXELS = Math.max(metrics.widthPixels, metrics.heightPixels); + DISPLAY_SHORT_PIXELS = Math.min(metrics.widthPixels, metrics.heightPixels); + + ActivityManager activityManager = context.getSystemService(ActivityManager.class); + ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); + activityManager.getMemoryInfo(memoryInfo); + TOTAL_MEMORY_MB = memoryInfo.totalMem / 1024 / 1024; + } else { + DISPLAY_DPI = 0; + DISPLAY_LONG_PIXELS = 0; + DISPLAY_SHORT_PIXELS = 0; + TOTAL_MEMORY_MB = 0; + } } /** |