Merge "mediapc: evaluator changes for frame drop tests" am: 5ace1fedc5 am: b8870ad2ba am: 0aa4c98dad am: efb20268aa am: b946f7b506
Original change: https://android-review.googlesource.com/c/platform/cts/+/2087526
Change-Id: I956dab11a2c4f1797a7dfd7098e9ef306dfe5944
Merged-In: I956dab11a2c4f1797a7dfd7098e9ef306dfe5944
Merged-In: I7f74919207b302c8de0af4a46c0dfcad62afdb55
Merged-In: I20df01a0de9d1dcdec3b80c486b22b42eb8d5fb6
Merged-In: I1a7cfd9f884525528d02d38a21bb1b1b6dfce981
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
(cherry picked from commit 76822de5a92cf46081384788dfa9fe4b62e697b6)
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 70340af..71bb8c8 100644
--- a/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java
+++ b/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java
@@ -22,18 +22,12 @@
import android.os.Build;
-import androidx.test.filters.SmallTest;
-
import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
import org.junit.rules.TestName;
-import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
-import java.util.HashMap;
-import java.util.Map;
/**
* Logs a set of measurements and results for defined performance class requirements.
@@ -285,6 +279,95 @@
}
}
+ // used for requirements [2.2.7.1/5.3/H-1-1], [2.2.7.1/5.3/H-1-2]
+ public static class FrameDropRequirement extends Requirement {
+ private static final String TAG = FrameDropRequirement.class.getSimpleName();
+
+ private FrameDropRequirement(String id, RequiredMeasurement<?>... reqs) {
+ super(id, reqs);
+ }
+
+ public void setFramesDropped(int framesDropped) {
+ this.setMeasuredValue(RequirementConstants.FRAMES_DROPPED, framesDropped);
+ }
+
+ /**
+ * [2.2.7.1/5.3/H-1-1] MUST NOT drop more than 1 frames in 10 seconds (i.e less than 0.333
+ * percent frame drop) for a 1080p 30 fps video session under load. Load is defined as a
+ * concurrent 1080p to 720p video-only transcoding session using hardware video codecs,
+ * as well as a 128 kbps AAC audio playback.
+ */
+ public static FrameDropRequirement createR5_3__H_1_1_R() {
+ RequiredMeasurement<Integer> frameDropped = RequiredMeasurement
+ .<Integer>builder()
+ .setId(RequirementConstants.FRAMES_DROPPED)
+ .setPredicate(RequirementConstants.INTEGER_LTE)
+ // MUST NOT drop more than 1 frame in 10 seconds so 3 frames for 30 seconds
+ .addRequiredValue(Build.VERSION_CODES.R, 3)
+ .build();
+
+ return new FrameDropRequirement(RequirementConstants.R5_3__H_1_1, frameDropped);
+ }
+
+ /**
+ * [2.2.7.1/5.3/H-1-2] MUST NOT drop more than 1 frame in 10 seconds during a video
+ * resolution change in a 30 fps video session under load. Load is defined as a
+ * concurrent 1080p to 720p video-only transcoding session using hardware video codecs,
+ * as well as a 128Kbps AAC audio playback.
+ */
+ public static FrameDropRequirement createR5_3__H_1_2_R() {
+ RequiredMeasurement<Integer> frameDropped = RequiredMeasurement
+ .<Integer>builder()
+ .setId(RequirementConstants.FRAMES_DROPPED)
+ .setPredicate(RequirementConstants.INTEGER_LTE)
+ // MUST NOT drop more than 1 frame in 10 seconds so 3 frames for 30 seconds
+ .addRequiredValue(Build.VERSION_CODES.R, 3)
+ .build();
+
+ return new FrameDropRequirement(RequirementConstants.R5_3__H_1_2, frameDropped);
+ }
+
+ /**
+ * [2.2.7.1/5.3/H-1-1] MUST NOT drop more than 2(S) / 1(T) frames in 10 seconds for a
+ * 1080p 60 fps video session under load. Load is defined as a concurrent 1080p to 720p
+ * video-only transcoding session using hardware video codecs, as well as a 128 kbps AAC
+ * audio playback.
+ */
+ public static FrameDropRequirement createR5_3__H_1_1_ST() {
+ RequiredMeasurement<Integer> frameDropped = RequiredMeasurement
+ .<Integer>builder()
+ .setId(RequirementConstants.FRAMES_DROPPED)
+ .setPredicate(RequirementConstants.INTEGER_LTE)
+ // MUST NOT drop more than 2 frame in 10 seconds so 6 frames for 30 seconds
+ .addRequiredValue(Build.VERSION_CODES.S, 6)
+ // MUST NOT drop more than 1 frame in 10 seconds so 3 frames for 30 seconds
+ .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 3)
+ .build();
+
+ return new FrameDropRequirement(RequirementConstants.R5_3__H_1_1, frameDropped);
+ }
+
+ /**
+ * [2.2.7.1/5.3/H-1-2] MUST NOT drop more than 2(S) / 1(T) frames in 10 seconds during a
+ * video resolution change in a 60 fps video session under load. Load is defined as a
+ * concurrent 1080p to 720p video-only transcoding session using hardware video codecs,
+ * as well as a 128Kbps AAC audio playback.
+ */
+ public static FrameDropRequirement createR5_3__H_1_2_ST() {
+ RequiredMeasurement<Integer> frameDropped = RequiredMeasurement
+ .<Integer>builder()
+ .setId(RequirementConstants.FRAMES_DROPPED)
+ .setPredicate(RequirementConstants.INTEGER_LTE)
+ // MUST NOT drop more than 2 frame in 10 seconds so 6 frames for 30 seconds
+ .addRequiredValue(Build.VERSION_CODES.S, 6)
+ // MUST NOT drop more than 1 frame in 10 seconds so 3 frames for 30 seconds
+ .addRequiredValue(Build.VERSION_CODES.TIRAMISU, 3)
+ .build();
+
+ return new FrameDropRequirement(RequirementConstants.R5_3__H_1_2, frameDropped);
+ }
+ }
+
private <R extends Requirement> R addRequirement(R req) {
if (!this.mRequirements.add(req)) {
throw new IllegalStateException("Requirement " + req.id() + " already added");
@@ -318,6 +401,22 @@
return this.<MemoryRequirement>addRequirement(MemoryRequirement.createR7_6_1__H_2_1());
}
+ public FrameDropRequirement addR5_3__H_1_1_R() {
+ return this.addRequirement(FrameDropRequirement.createR5_3__H_1_1_R());
+ }
+
+ public FrameDropRequirement addR5_3__H_1_2_R() {
+ return this.addRequirement(FrameDropRequirement.createR5_3__H_1_2_R());
+ }
+
+ public FrameDropRequirement addR5_3__H_1_1_ST() {
+ return this.addRequirement(FrameDropRequirement.createR5_3__H_1_1_ST());
+ }
+
+ public FrameDropRequirement addR5_3__H_1_2_ST() {
+ return this.addRequirement(FrameDropRequirement.createR5_3__H_1_2_ST());
+ }
+
public CodecInitLatencyRequirement addR5_1__H_1_7() {
return this.addRequirement(CodecInitLatencyRequirement.createR5_1__H_1_7());
}
diff --git a/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java b/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
index 49ae4a1..9d857d2 100644
--- a/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/AdaptivePlaybackFrameDropTest.java
@@ -19,19 +19,17 @@
import static org.junit.Assert.assertTrue;
import android.media.MediaCodecInfo;
+import android.mediapc.cts.common.PerformanceClassEvaluator;
import android.mediapc.cts.common.Utils;
-import android.os.Build;
import androidx.test.filters.LargeTest;
-import androidx.test.platform.app.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.Assume;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TestName;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -49,6 +47,9 @@
super(mimeType, decoderName, isAsync);
}
+ @Rule
+ public final TestName mTestName = new TestName();
+
// Returns the list of parameters with mimeTypes and their hardware decoders supporting the
// AdaptivePlayback feature combining with sync and async modes.
// Parameters {0}_{1}_{2} -- Mime_DecoderName_isAsync
@@ -58,29 +59,14 @@
MediaCodecInfo.CodecCapabilities.FEATURE_AdaptivePlayback});
}
- private void testAdaptivePlaybackFrameDrop(int frameRate) throws Exception {
+ private int testAdaptivePlaybackFrameDrop(int frameRate) throws Exception {
String[] testFiles = frameRate == 30 ?
new String[]{m1080p30FpsTestFiles.get(mMime), m540p30FpsTestFiles.get(mMime)} :
new String[]{m1080p60FpsTestFiles.get(mMime), m540p60FpsTestFiles.get(mMime)};
PlaybackFrameDrop playbackFrameDrop = new PlaybackFrameDrop(mMime, mDecoderName, testFiles,
mSurface, frameRate, mIsAsync);
- int frameDropCount = playbackFrameDrop.getFrameDropCount();
- if (Utils.isPerfClass()) {
- assertTrue("Adaptive Playback FrameDrop count for mime: " + mMime + ", decoder: "
- + mDecoderName + ", FrameRate: " + frameRate
- + ", is not as expected. act/exp: " + frameDropCount + "/"
- + MAX_FRAME_DROP_FOR_30S, frameDropCount <= MAX_FRAME_DROP_FOR_30S);
- } else {
- int pc = getAchievedPerfClass(frameRate, frameDropCount);
- DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
- "AdaptiveFrameDrop_" + mDecoderName);
- log.addValue("decoder", mDecoderName, ResultType.NEUTRAL, ResultUnit.NONE);
- log.addValue("adaptive_frame_drops_for_30sec", frameDropCount, ResultType.LOWER_BETTER,
- ResultUnit.NONE);
- log.setSummary("CDD 2.2.7.1/5.3/H-1-2 performance_class", pc, ResultType.NEUTRAL,
- ResultUnit.NONE);
- log.submit(InstrumentationRegistry.getInstrumentation());
- }
+
+ return playbackFrameDrop.getFrameDropCount();
}
/**
@@ -94,9 +80,16 @@
@CddTest(requirement = "2.2.7.1/5.3/H-1-2")
public void test30Fps() throws Exception {
Assume.assumeTrue("Test is limited to R performance class devices or devices that do not " +
- "advertise performance class",
- Utils.isRPerfClass() || !Utils.isPerfClass());
- testAdaptivePlaybackFrameDrop(30);
+ "advertise performance class",
+ Utils.isRPerfClass() || !Utils.isPerfClass());
+
+ PerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName);
+ PerformanceClassEvaluator.FrameDropRequirement r5_3__H_1_2_R = pce.addR5_3__H_1_2_R();
+
+ int framesDropped = testAdaptivePlaybackFrameDrop(30);
+
+ r5_3__H_1_2_R.setFramesDropped(framesDropped);
+ pce.submitAndCheck();
}
/**
@@ -110,8 +103,15 @@
@CddTest(requirement = "2.2.7.1/5.3/H-1-2")
public void test60Fps() throws Exception {
Assume.assumeTrue("Test is limited to S/T performance class devices or devices that do " +
- "not advertise performance class",
- Utils.isSPerfClass() || Utils.isTPerfClass() || !Utils.isPerfClass());
- testAdaptivePlaybackFrameDrop(60);
+ "not advertise performance class",
+ Utils.isSPerfClass() || Utils.isTPerfClass() || !Utils.isPerfClass());
+
+ PerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName);
+ PerformanceClassEvaluator.FrameDropRequirement r5_3__H_1_2_ST = pce.addR5_3__H_1_2_ST();
+
+ int framesDropped = testAdaptivePlaybackFrameDrop(60);
+
+ r5_3__H_1_2_ST.setFramesDropped(framesDropped);
+ pce.submitAndCheck();
}
}
diff --git a/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java b/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
index fd015aa..4e9409e 100644
--- a/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/FrameDropTest.java
@@ -16,26 +16,18 @@
package android.mediapc.cts;
-import static org.junit.Assert.assertTrue;
-
+import android.mediapc.cts.common.PerformanceClassEvaluator;
import android.mediapc.cts.common.Utils;
-import android.os.Build;
-
import androidx.test.filters.LargeTest;
-import androidx.test.platform.app.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 java.util.Collection;
import org.junit.Assume;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.TestName;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
-import java.util.Collection;
-
/**
* The following test class validates the frame drops of a playback for the hardware decoders
* under the load condition (Transcode + Audio Playback).
@@ -48,6 +40,9 @@
super(mimeType, decoderName, isAsync);
}
+ @Rule
+ public final TestName mTestName = new TestName();
+
// Returns the list of parameters with mimeTypes and their hardware decoders
// combining with sync and async modes.
// Parameters {0}_{1}_{2} -- Mime_DecoderName_isAsync
@@ -56,29 +51,13 @@
return prepareArgumentsList(null);
}
- private void testDecodeToSurface(int frameRate) throws Exception {
+ private int testDecodeToSurface(int frameRate) throws Exception {
String[] testFiles = frameRate == 30 ?
new String[]{m1080p30FpsTestFiles.get(mMime)} :
new String[]{m1080p60FpsTestFiles.get(mMime)};
PlaybackFrameDrop playbackFrameDrop = new PlaybackFrameDrop(mMime, mDecoderName, testFiles,
mSurface, frameRate, mIsAsync);
- int frameDropCount = playbackFrameDrop.getFrameDropCount();
- if (Utils.isPerfClass()) {
- assertTrue("FrameDrop count for mime: " + mMime + ", decoder: " + mDecoderName
- + ", FrameRate: " + frameRate + ", is not as expected. act/exp: "
- + frameDropCount + "/" + MAX_FRAME_DROP_FOR_30S,
- frameDropCount <= MAX_FRAME_DROP_FOR_30S);
- } else {
- int pc = getAchievedPerfClass(frameRate, frameDropCount);
- DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",
- "FrameDrop_" + mDecoderName);
- log.addValue("decoder", mDecoderName, ResultType.NEUTRAL, ResultUnit.NONE);
- log.addValue("frame_drops_for_30sec_" + frameRate + "fps", frameDropCount,
- ResultType.LOWER_BETTER, ResultUnit.NONE);
- log.setSummary("CDD 2.2.7.1/5.3/H-1-1 performance_class", pc, ResultType.NEUTRAL,
- ResultUnit.NONE);
- log.submit(InstrumentationRegistry.getInstrumentation());
- }
+ return playbackFrameDrop.getFrameDropCount();
}
/**
@@ -93,7 +72,13 @@
Assume.assumeTrue("Test is limited to R performance class devices or devices that do not " +
"advertise performance class",
Utils.isRPerfClass() || !Utils.isPerfClass());
- testDecodeToSurface(30);
+
+ PerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName);
+ PerformanceClassEvaluator.FrameDropRequirement r5_3__H_1_1_R = pce.addR5_3__H_1_1_R();
+
+ int framesDropped = testDecodeToSurface(30);
+ r5_3__H_1_1_R.setFramesDropped(framesDropped);
+ pce.submitAndCheck();
}
/**
@@ -108,6 +93,12 @@
Assume.assumeTrue("Test is limited to S/T performance class devices or devices that do " +
"not advertise performance class",
Utils.isSPerfClass() || Utils.isTPerfClass() || !Utils.isPerfClass());
- testDecodeToSurface(60);
+
+ PerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName);
+ PerformanceClassEvaluator.FrameDropRequirement r5_3__H_1_1_ST = pce.addR5_3__H_1_1_ST();
+
+ int framesDropped = testDecodeToSurface(60);
+ r5_3__H_1_1_ST.setFramesDropped(framesDropped);
+ pce.submitAndCheck();
}
}