xref: /aosp_15_r20/cts/tests/mediapc/common/README.md (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker# Writing an MPC Test
2*b7c941bbSAndroid Build Coastguard Worker
3*b7c941bbSAndroid Build Coastguard WorkerUsing
4*b7c941bbSAndroid Build Coastguard Worker[this CL](https://android-review.googlesource.com/c/platform/cts/+/3185540) as a
5*b7c941bbSAndroid Build Coastguard Workerguide focusing on requirement
6*b7c941bbSAndroid Build Coastguard Worker[5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media):
7*b7c941bbSAndroid Build Coastguard Worker
8*b7c941bbSAndroid Build Coastguard Worker-   R: MUST support 6 instances of hardware video decoder sessions (AVC or HEVC)
9*b7c941bbSAndroid Build Coastguard Worker    in any codec combination running concurrently at 720p resolution@30 fps.
10*b7c941bbSAndroid Build Coastguard Worker-   S: MUST support 6 instances of hardware video decoder sessions (AVC, HEVC,
11*b7c941bbSAndroid Build Coastguard Worker    VP9* or later) in any codec combination running concurrently at 720p
12*b7c941bbSAndroid Build Coastguard Worker    resolution@30 fps. *Only 2 instances are required if VP9 codec is present.
13*b7c941bbSAndroid Build Coastguard Worker-   Tiramisu: MUST support 6 instances of hardware video decoder sessions (AVC,
14*b7c941bbSAndroid Build Coastguard Worker    HEVC, VP9, AV1 or later) in any codec combination running concurrently at
15*b7c941bbSAndroid Build Coastguard Worker    1080p resolution@30 fps.
16*b7c941bbSAndroid Build Coastguard Worker-   Upside-Down Cake: MUST support 6 instances of 8-bit (SDR) hardware video
17*b7c941bbSAndroid Build Coastguard Worker    decoder sessions (AVC, HEVC, VP9, AV1 or later) in any codec combination
18*b7c941bbSAndroid Build Coastguard Worker    running concurrently with 3 sessions at 1080p resolution@30 fps and 3
19*b7c941bbSAndroid Build Coastguard Worker    sessions at 4k resolution@30fps, unless AV1. AV1 codecs are only required to
20*b7c941bbSAndroid Build Coastguard Worker    support 1080p resolution, but are still required to support 6 instances at
21*b7c941bbSAndroid Build Coastguard Worker    1080p30fps.
22*b7c941bbSAndroid Build Coastguard Worker-   Vanilla Ice Cream: MUST support 6 instances of 8-bit (SDR) hardware video
23*b7c941bbSAndroid Build Coastguard Worker    decoder sessions (AVC, HEVC, VP9, AV1, or later) in any codec combination
24*b7c941bbSAndroid Build Coastguard Worker    running concurrently with 3 sessions at 1080p resolution@30 fps and 3
25*b7c941bbSAndroid Build Coastguard Worker    sessions at 4k resolution@30fps, unless AV1. For all sessions, there MUST
26*b7c941bbSAndroid Build Coastguard Worker    NOT be more than 1 frame dropped per second. AV1 codecs are only required to
27*b7c941bbSAndroid Build Coastguard Worker    support 1080p resolution, but are still required to support 6 instances at
28*b7c941bbSAndroid Build Coastguard Worker    1080p30fps.
29*b7c941bbSAndroid Build Coastguard Worker
30*b7c941bbSAndroid Build Coastguard Worker## Define Requirements
31*b7c941bbSAndroid Build Coastguard Worker
32*b7c941bbSAndroid Build Coastguard WorkerEach requirement needs to be defined in
33*b7c941bbSAndroid Build Coastguard Worker[requirements.txtpb](https://cs.android.com/android/platform/superproject/main/+/main:cts/tests/mediapc/requirements/requirements.txtpb).
34*b7c941bbSAndroid Build Coastguard WorkerThe information in this file is then used to generate code to be used in tests
35*b7c941bbSAndroid Build Coastguard Workerfor said requirement.
36*b7c941bbSAndroid Build Coastguard Worker
37*b7c941bbSAndroid Build Coastguard Worker### Give the Requirement a Name
38*b7c941bbSAndroid Build Coastguard Worker
39*b7c941bbSAndroid Build Coastguard WorkerEach requirement needs to be given a human-readable name describing what the
40*b7c941bbSAndroid Build Coastguard Workerrequirement is testing for. Additionally, each requirement name needs to be
41*b7c941bbSAndroid Build Coastguard Workerunique. This name is then used for the class name when generating code.
42*b7c941bbSAndroid Build Coastguard Worker
43*b7c941bbSAndroid Build Coastguard WorkerFor example, we gave
44*b7c941bbSAndroid Build Coastguard Worker[5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media)
45*b7c941bbSAndroid Build Coastguard Workerthe name `"Concurrent Video Decoder Sessions"`. This will then generate the
46*b7c941bbSAndroid Build Coastguard Workerfollowing class:
47*b7c941bbSAndroid Build Coastguard Worker
48*b7c941bbSAndroid Build Coastguard Worker```
49*b7c941bbSAndroid Build Coastguard Workerandroid.mediapc.cts.common.Requirements.ConcurrentVideoDecoderSessionsRequirement
50*b7c941bbSAndroid Build Coastguard Worker```
51*b7c941bbSAndroid Build Coastguard Worker
52*b7c941bbSAndroid Build Coastguard Worker### Define Test Configs
53*b7c941bbSAndroid Build Coastguard Worker
54*b7c941bbSAndroid Build Coastguard WorkerA test config describes different set ups for a given requirement that change
55*b7c941bbSAndroid Build Coastguard Workerwhich performance classes are being tested for said requirement.
56*b7c941bbSAndroid Build Coastguard Worker
57*b7c941bbSAndroid Build Coastguard WorkerFor example: requirement,
58*b7c941bbSAndroid Build Coastguard Worker[5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media),
59*b7c941bbSAndroid Build Coastguard Workerthere's 3 test configs: - 720p: which describes tests ran at 720p (makes sense),
60*b7c941bbSAndroid Build Coastguard Workerthese tests only check for performance classes R and S. - 1080p: these tests
61*b7c941bbSAndroid Build Coastguard Workeronly check for performance class Tiramisu. - 4k: these tests only check for
62*b7c941bbSAndroid Build Coastguard Workerperformance classes Upside-down Cake and Vanilla Ice Cream
63*b7c941bbSAndroid Build Coastguard Worker
64*b7c941bbSAndroid Build Coastguard WorkerAdditionally each test config needs to be given a proto field number. This
65*b7c941bbSAndroid Build Coastguard Workernumber must be unique for *all* test configs within
66*b7c941bbSAndroid Build Coastguard Worker[requirements.txtpb](https://cs.android.com/android/platform/superproject/main/+/main:cts/tests/mediapc/requirements/requirements.txtpb).
67*b7c941bbSAndroid Build Coastguard Worker
68*b7c941bbSAndroid Build Coastguard Worker```
69*b7c941bbSAndroid Build Coastguard Workertest_configs: {
70*b7c941bbSAndroid Build Coastguard Worker  key: "720p"
71*b7c941bbSAndroid Build Coastguard Worker  value: {
72*b7c941bbSAndroid Build Coastguard Worker    description: "Tests running at 720p"
73*b7c941bbSAndroid Build Coastguard Worker    proto_field_number: 4
74*b7c941bbSAndroid Build Coastguard Worker  }
75*b7c941bbSAndroid Build Coastguard Worker}
76*b7c941bbSAndroid Build Coastguard Workertest_configs: {
77*b7c941bbSAndroid Build Coastguard Worker  key: "1080p"
78*b7c941bbSAndroid Build Coastguard Worker  value: {
79*b7c941bbSAndroid Build Coastguard Worker    description: "Tests running at 1080p"
80*b7c941bbSAndroid Build Coastguard Worker    proto_field_number: 5
81*b7c941bbSAndroid Build Coastguard Worker  }
82*b7c941bbSAndroid Build Coastguard Worker}
83*b7c941bbSAndroid Build Coastguard Workertest_configs: {
84*b7c941bbSAndroid Build Coastguard Worker  key: "4k"
85*b7c941bbSAndroid Build Coastguard Worker  value: {
86*b7c941bbSAndroid Build Coastguard Worker    description: "Tests running at 4k"
87*b7c941bbSAndroid Build Coastguard Worker    proto_field_number: 6
88*b7c941bbSAndroid Build Coastguard Worker  }
89*b7c941bbSAndroid Build Coastguard Worker}
90*b7c941bbSAndroid Build Coastguard Worker```
91*b7c941bbSAndroid Build Coastguard Worker
92*b7c941bbSAndroid Build Coastguard WorkerNOTE: The changelist for
93*b7c941bbSAndroid Build Coastguard Worker[5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media)
94*b7c941bbSAndroid Build Coastguard Workerdescribes an `id` field. This field has since been deprecated and removed, so
95*b7c941bbSAndroid Build Coastguard Workerplease ignore it.
96*b7c941bbSAndroid Build Coastguard Worker
97*b7c941bbSAndroid Build Coastguard WorkerNOTE: The changelist for
98*b7c941bbSAndroid Build Coastguard Worker[5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media)
99*b7c941bbSAndroid Build Coastguard Workerdoes not describe proto field numbers. These were yet to be implemented when the
100*b7c941bbSAndroid Build Coastguard Workerchange was created. They are implemented now.
101*b7c941bbSAndroid Build Coastguard Worker
102*b7c941bbSAndroid Build Coastguard WorkerTIP: Most requirements only use one test configuration to describe a singular
103*b7c941bbSAndroid Build Coastguard Workertest which tests for all performance classes. For these requirements, you only
104*b7c941bbSAndroid Build Coastguard Workerneed to specify a blank default test config. Example:
105*b7c941bbSAndroid Build Coastguard Worker[cl/666945690](https://android-review.googlesource.com/c/platform/cts/+/3237331)
106*b7c941bbSAndroid Build Coastguard Worker
107*b7c941bbSAndroid Build Coastguard Worker```
108*b7c941bbSAndroid Build Coastguard Workertest_configs: {
109*b7c941bbSAndroid Build Coastguard Worker  key: ""
110*b7c941bbSAndroid Build Coastguard Worker  value: {
111*b7c941bbSAndroid Build Coastguard Worker    description: "Default test config"
112*b7c941bbSAndroid Build Coastguard Worker    proto_field_number: 47
113*b7c941bbSAndroid Build Coastguard Worker  }
114*b7c941bbSAndroid Build Coastguard Worker}
115*b7c941bbSAndroid Build Coastguard Worker```
116*b7c941bbSAndroid Build Coastguard Worker
117*b7c941bbSAndroid Build Coastguard Worker### Define Variants
118*b7c941bbSAndroid Build Coastguard Worker
119*b7c941bbSAndroid Build Coastguard WorkerIn addition to test configs, any variants for a given requirement must also be
120*b7c941bbSAndroid Build Coastguard Workerdefined.
121*b7c941bbSAndroid Build Coastguard Worker
122*b7c941bbSAndroid Build Coastguard WorkerA variant describes a different set of thresholds a requirement must meet
123*b7c941bbSAndroid Build Coastguard Workerdepending on the test setup. The main difference between a variant and a test
124*b7c941bbSAndroid Build Coastguard Workerconfig is variants do NOT affect which performance classes are being tested.
125*b7c941bbSAndroid Build Coastguard Worker
126*b7c941bbSAndroid Build Coastguard WorkerVariants do NOT need proto field numbers.
127*b7c941bbSAndroid Build Coastguard Worker
128*b7c941bbSAndroid Build Coastguard WorkerFor our requirement,
129*b7c941bbSAndroid Build Coastguard Worker[5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media),
130*b7c941bbSAndroid Build Coastguard Workerwhen testing with a VP9 codec at 720p, 2 instances are required for S and none
131*b7c941bbSAndroid Build Coastguard Workerfor R, and when testing with an AV1 or other codec, there is no requirement for
132*b7c941bbSAndroid Build Coastguard WorkerR. Therefore, we have created 2 variants:
133*b7c941bbSAndroid Build Coastguard Worker
134*b7c941bbSAndroid Build Coastguard Worker```
135*b7c941bbSAndroid Build Coastguard Workervariants: {
136*b7c941bbSAndroid Build Coastguard Worker  key: "VP9"
137*b7c941bbSAndroid Build Coastguard Worker  value: {
138*b7c941bbSAndroid Build Coastguard Worker    description: "When one of the codecs is VP9, variant used in 720p tests"
139*b7c941bbSAndroid Build Coastguard Worker  }
140*b7c941bbSAndroid Build Coastguard Worker}
141*b7c941bbSAndroid Build Coastguard Workervariants: {
142*b7c941bbSAndroid Build Coastguard Worker  key: "AV1"
143*b7c941bbSAndroid Build Coastguard Worker  value: {
144*b7c941bbSAndroid Build Coastguard Worker    description: "When one of the codecs is AV1, variant used in 720p tests"
145*b7c941bbSAndroid Build Coastguard Worker  }
146*b7c941bbSAndroid Build Coastguard Worker}
147*b7c941bbSAndroid Build Coastguard Worker```
148*b7c941bbSAndroid Build Coastguard Worker
149*b7c941bbSAndroid Build Coastguard WorkerNOTE: Sometimes, it can be confusing whether to make a variant or a test config
150*b7c941bbSAndroid Build Coastguard Workerwhen defining requirements. If unsure, the recommendation is to make another
151*b7c941bbSAndroid Build Coastguard Workertest config rather than another variant.
152*b7c941bbSAndroid Build Coastguard Worker
153*b7c941bbSAndroid Build Coastguard WorkerNOTE: A variant does not need to be used in every test config.
154*b7c941bbSAndroid Build Coastguard Worker
155*b7c941bbSAndroid Build Coastguard Worker### Define Measurements
156*b7c941bbSAndroid Build Coastguard Worker
157*b7c941bbSAndroid Build Coastguard WorkerA set of measurements for the requirement must also be defined. Each measurement
158*b7c941bbSAndroid Build Coastguard Workerneeds a name, a measurement_type, a comparison, and a proto field number.
159*b7c941bbSAndroid Build Coastguard Worker
160*b7c941bbSAndroid Build Coastguard WorkerThe measurement name is described in the `key` field for each measurement. It
161*b7c941bbSAndroid Build Coastguard Workerneeds to be able to be used as a field for a proto, so lowercase, underscores,
162*b7c941bbSAndroid Build Coastguard Workerno spaces, etc.
163*b7c941bbSAndroid Build Coastguard Worker
164*b7c941bbSAndroid Build Coastguard WorkerThe `measurement_type` describes the data type of the measurement. It can be one
165*b7c941bbSAndroid Build Coastguard Workerof the following types:
166*b7c941bbSAndroid Build Coastguard Worker
167*b7c941bbSAndroid Build Coastguard Worker-   MEASUREMENT_TYPE_BOOL
168*b7c941bbSAndroid Build Coastguard Worker-   MEASUREMENT_TYPE_DOUBLE
169*b7c941bbSAndroid Build Coastguard Worker-   MEASUREMENT_TYPE_INT
170*b7c941bbSAndroid Build Coastguard Worker-   MEASUREMENT_TYPE_STRING
171*b7c941bbSAndroid Build Coastguard Worker-   MEASUREMENT_TYPE_LONG
172*b7c941bbSAndroid Build Coastguard Worker-   MEASUREMENT_TYPE_FLOAT
173*b7c941bbSAndroid Build Coastguard Worker
174*b7c941bbSAndroid Build Coastguard WorkerThe `comparison` describes how the measurement will be tested when evaluating
175*b7c941bbSAndroid Build Coastguard Workerthe performance class. It can be one of the following types:
176*b7c941bbSAndroid Build Coastguard Worker
177*b7c941bbSAndroid Build Coastguard Worker-   COMPARISON_EQUAL
178*b7c941bbSAndroid Build Coastguard Worker-   COMPARISON_LESS_THAN
179*b7c941bbSAndroid Build Coastguard Worker-   COMPARISON_LESS_THAN_OR_EQUAL
180*b7c941bbSAndroid Build Coastguard Worker-   COMPARISON_GREATER_THAN
181*b7c941bbSAndroid Build Coastguard Worker-   COMPARISON_GREATER_THAN_OR_EQUAL
182*b7c941bbSAndroid Build Coastguard Worker-   COMPARISON_INFO_ONLY
183*b7c941bbSAndroid Build Coastguard Worker-   COMPARISON_CONFIG
184*b7c941bbSAndroid Build Coastguard Worker
185*b7c941bbSAndroid Build Coastguard WorkerNOTE: Config comparison types are measurements that describe how the test was
186*b7c941bbSAndroid Build Coastguard Workerset up. These values are automatically set, and the thresholds defined later
187*b7c941bbSAndroid Build Coastguard Workermust all be the same per test config.
188*b7c941bbSAndroid Build Coastguard Worker
189*b7c941bbSAndroid Build Coastguard WorkerFinally, like with test configs, each measurement needs a `proto_field_number`.
190*b7c941bbSAndroid Build Coastguard WorkerFor measurements, the number must be greater than or equal to 3, and only needs
191*b7c941bbSAndroid Build Coastguard Workerto be unique among the other measurements for a given requirement.
192*b7c941bbSAndroid Build Coastguard Worker
193*b7c941bbSAndroid Build Coastguard WorkerFor our requirement,
194*b7c941bbSAndroid Build Coastguard Worker[5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media),
195*b7c941bbSAndroid Build Coastguard Workerwe've defined the following:
196*b7c941bbSAndroid Build Coastguard Worker
197*b7c941bbSAndroid Build Coastguard Worker```
198*b7c941bbSAndroid Build Coastguard Workermeasurements: {
199*b7c941bbSAndroid Build Coastguard Worker  key: "concurrent_fps"
200*b7c941bbSAndroid Build Coastguard Worker  value: {
201*b7c941bbSAndroid Build Coastguard Worker    description: "The number of frames per second that can be decoded concurrently"
202*b7c941bbSAndroid Build Coastguard Worker    measurement_type: MEASUREMENT_TYPE_DOUBLE
203*b7c941bbSAndroid Build Coastguard Worker    comparison: COMPARISON_GREATER_THAN_OR_EQUAL
204*b7c941bbSAndroid Build Coastguard Worker    proto_field_number: 3
205*b7c941bbSAndroid Build Coastguard Worker  }
206*b7c941bbSAndroid Build Coastguard Worker}
207*b7c941bbSAndroid Build Coastguard Workermeasurements: {
208*b7c941bbSAndroid Build Coastguard Worker  key: "frame_drops_per_sec"
209*b7c941bbSAndroid Build Coastguard Worker  value: {
210*b7c941bbSAndroid Build Coastguard Worker    description: "The number of frames dropped per second"
211*b7c941bbSAndroid Build Coastguard Worker    measurement_type: MEASUREMENT_TYPE_DOUBLE
212*b7c941bbSAndroid Build Coastguard Worker    comparison: COMPARISON_LESS_THAN_OR_EQUAL
213*b7c941bbSAndroid Build Coastguard Worker    proto_field_number: 4
214*b7c941bbSAndroid Build Coastguard Worker  }
215*b7c941bbSAndroid Build Coastguard Worker}
216*b7c941bbSAndroid Build Coastguard Workermeasurements: {
217*b7c941bbSAndroid Build Coastguard Worker  key: "resolution"
218*b7c941bbSAndroid Build Coastguard Worker  value: {
219*b7c941bbSAndroid Build Coastguard Worker    description: "The resolution the test was run at"
220*b7c941bbSAndroid Build Coastguard Worker    measurement_type: MEASUREMENT_TYPE_INT
221*b7c941bbSAndroid Build Coastguard Worker    comparison: COMPARISON_CONFIG
222*b7c941bbSAndroid Build Coastguard Worker    proto_field_number: 5
223*b7c941bbSAndroid Build Coastguard Worker  }
224*b7c941bbSAndroid Build Coastguard Worker}
225*b7c941bbSAndroid Build Coastguard Worker```
226*b7c941bbSAndroid Build Coastguard Worker
227*b7c941bbSAndroid Build Coastguard Worker### Define Specs
228*b7c941bbSAndroid Build Coastguard Worker
229*b7c941bbSAndroid Build Coastguard WorkerLastly, the specs for the requirement need to be defined. A spec describes the
230*b7c941bbSAndroid Build Coastguard Workerrequired thresholds for a given performance class. It has the following fields:
231*b7c941bbSAndroid Build Coastguard Worker`mpc`, `specification`, `test_config_id`, and `required_values`. Additionally it
232*b7c941bbSAndroid Build Coastguard Workeris stored as a map within
233*b7c941bbSAndroid Build Coastguard Worker[requirements.txtpb](https://cs.android.com/android/platform/superproject/main/+/main:cts/tests/mediapc/requirements/requirements.txtpb),
234*b7c941bbSAndroid Build Coastguard Workerso it needs a `key` field which corresponds to performance class the spec
235*b7c941bbSAndroid Build Coastguard Workerdescribes.
236*b7c941bbSAndroid Build Coastguard Worker
237*b7c941bbSAndroid Build Coastguard WorkerThe field `mpc` is an enum that also describes the performance class associated
238*b7c941bbSAndroid Build Coastguard Workerwith the spec. As such, it should correspond to `key` field. -
239*b7c941bbSAndroid Build Coastguard WorkerMEDIA_PERFORMANCE_CLASS_11 corresponds to 30 - MEDIA_PERFORMANCE_CLASS_12
240*b7c941bbSAndroid Build Coastguard Workercorresponds to 31 - MEDIA_PERFORMANCE_CLASS_13 corresponds to 33 -
241*b7c941bbSAndroid Build Coastguard WorkerMEDIA_PERFORMANCE_CLASS_14 corresponds to 34 - MEDIA_PERFORMANCE_CLASS_15
242*b7c941bbSAndroid Build Coastguard Workercorresponds to 35
243*b7c941bbSAndroid Build Coastguard Worker
244*b7c941bbSAndroid Build Coastguard WorkerThe field `specification` describes in text what the requirement is and the
245*b7c941bbSAndroid Build Coastguard Workerthreshold that must be met. This text is copied directly from the
246*b7c941bbSAndroid Build Coastguard Worker[Android CDD](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media)
247*b7c941bbSAndroid Build Coastguard Workerfor a given requirement/performance class.
248*b7c941bbSAndroid Build Coastguard Worker
249*b7c941bbSAndroid Build Coastguard WorkerThe field `test_config_id` describes the associated `test_config_id` which was
250*b7c941bbSAndroid Build Coastguard Workerdefined previously. If it is the default blank `test_config_id`, the field does
251*b7c941bbSAndroid Build Coastguard Workernot have to be set.
252*b7c941bbSAndroid Build Coastguard Worker
253*b7c941bbSAndroid Build Coastguard Worker#### Define Required Values
254*b7c941bbSAndroid Build Coastguard Worker
255*b7c941bbSAndroid Build Coastguard WorkerFinally, `required_values` must be defined for all measurements associated with
256*b7c941bbSAndroid Build Coastguard Workerthe specified performance class. These values are stored as a map where the
257*b7c941bbSAndroid Build Coastguard Worker`key` corresponds to the measurement name, and the value corresponds to the
258*b7c941bbSAndroid Build Coastguard Workerrequired threshold.
259*b7c941bbSAndroid Build Coastguard Worker
260*b7c941bbSAndroid Build Coastguard WorkerNOTE: if a measurement is not needed for a given performance class level it does
261*b7c941bbSAndroid Build Coastguard Workernot have to be specified
262*b7c941bbSAndroid Build Coastguard Worker
263*b7c941bbSAndroid Build Coastguard WorkerNOTE: config measurements must have the same threshold for all performance class
264*b7c941bbSAndroid Build Coastguard Workerlevels for a given test config
265*b7c941bbSAndroid Build Coastguard Worker
266*b7c941bbSAndroid Build Coastguard Worker##### Define Variant Required Values
267*b7c941bbSAndroid Build Coastguard Worker
268*b7c941bbSAndroid Build Coastguard WorkerAdditionally, `required_values` must be set for variants. A described variant
269*b7c941bbSAndroid Build Coastguard Workerdoes not have to correspond to every test config, but if described for given
270*b7c941bbSAndroid Build Coastguard Workertest config, it must be described for all specs with the same test config.
271*b7c941bbSAndroid Build Coastguard Worker
272*b7c941bbSAndroid Build Coastguard Worker### Example Generated Class for [5.1/H-1-2](https://source.android.com/docs/compatibility/15/android-15-cdd#2271_media)
273*b7c941bbSAndroid Build Coastguard Worker
274*b7c941bbSAndroid Build Coastguard Worker```
275*b7c941bbSAndroid Build Coastguard Worker/**
276*b7c941bbSAndroid Build Coastguard Worker  * Add a new ConcurrentVideoDecoderSessionsRequirement for requirement 5.1/H-1-2 to a
277*b7c941bbSAndroid Build Coastguard Worker  * {@code PerformanceClassEvaluator} instance.
278*b7c941bbSAndroid Build Coastguard Worker  *
279*b7c941bbSAndroid Build Coastguard Worker  * Concurrent video decoder sessions
280*b7c941bbSAndroid Build Coastguard Worker  */
281*b7c941bbSAndroid Build Coastguard Workerpublic static ConcurrentVideoDecoderSessionsRequirement.With addR5_1__H_1_2() {
282*b7c941bbSAndroid Build Coastguard Worker    return new ConcurrentVideoDecoderSessionsRequirement.With();
283*b7c941bbSAndroid Build Coastguard Worker}
284*b7c941bbSAndroid Build Coastguard Worker
285*b7c941bbSAndroid Build Coastguard Worker/**
286*b7c941bbSAndroid Build Coastguard Worker  * 5.1/H-1-2 Concurrent Video Decoder Sessions
287*b7c941bbSAndroid Build Coastguard Worker  *
288*b7c941bbSAndroid Build Coastguard Worker  * Concurrent video decoder sessions
289*b7c941bbSAndroid Build Coastguard Worker  */
290*b7c941bbSAndroid Build Coastguard Workerpublic static final class ConcurrentVideoDecoderSessionsRequirement extends Requirement {
291*b7c941bbSAndroid Build Coastguard Worker
292*b7c941bbSAndroid Build Coastguard Worker    public static final class With {
293*b7c941bbSAndroid Build Coastguard Worker        private With() {}
294*b7c941bbSAndroid Build Coastguard Worker        public static final class Config1080P {
295*b7c941bbSAndroid Build Coastguard Worker            private Config1080P() {}
296*b7c941bbSAndroid Build Coastguard Worker            public ConcurrentVideoDecoderSessionsRequirement to(PerformanceClassEvaluator pce) {
297*b7c941bbSAndroid Build Coastguard Worker                return pce.addRequirement(ConcurrentVideoDecoderSessionsRequirement.create1080P());
298*b7c941bbSAndroid Build Coastguard Worker            }
299*b7c941bbSAndroid Build Coastguard Worker        }
300*b7c941bbSAndroid Build Coastguard Worker        public static final class Config4K {
301*b7c941bbSAndroid Build Coastguard Worker            private Config4K() {}
302*b7c941bbSAndroid Build Coastguard Worker            public ConcurrentVideoDecoderSessionsRequirement to(PerformanceClassEvaluator pce) {
303*b7c941bbSAndroid Build Coastguard Worker                return pce.addRequirement(ConcurrentVideoDecoderSessionsRequirement.create4K());
304*b7c941bbSAndroid Build Coastguard Worker            }
305*b7c941bbSAndroid Build Coastguard Worker        }
306*b7c941bbSAndroid Build Coastguard Worker        public static final class Config720P {
307*b7c941bbSAndroid Build Coastguard Worker            private Config720P() {}
308*b7c941bbSAndroid Build Coastguard Worker            public ConcurrentVideoDecoderSessionsRequirement to(PerformanceClassEvaluator pce) {
309*b7c941bbSAndroid Build Coastguard Worker                return pce.addRequirement(ConcurrentVideoDecoderSessionsRequirement.create720P());
310*b7c941bbSAndroid Build Coastguard Worker            }
311*b7c941bbSAndroid Build Coastguard Worker            public Config720PAndVariantAV1 withVariantAV1() {
312*b7c941bbSAndroid Build Coastguard Worker                return new Config720PAndVariantAV1();
313*b7c941bbSAndroid Build Coastguard Worker            }
314*b7c941bbSAndroid Build Coastguard Worker            public Config720PAndVariantVP9 withVariantVP9() {
315*b7c941bbSAndroid Build Coastguard Worker                return new Config720PAndVariantVP9();
316*b7c941bbSAndroid Build Coastguard Worker            }
317*b7c941bbSAndroid Build Coastguard Worker        }
318*b7c941bbSAndroid Build Coastguard Worker        public static final class VariantAV1 {
319*b7c941bbSAndroid Build Coastguard Worker            private VariantAV1() {}
320*b7c941bbSAndroid Build Coastguard Worker            public Config720PAndVariantAV1 withConfig720P() {
321*b7c941bbSAndroid Build Coastguard Worker                return new Config720PAndVariantAV1();
322*b7c941bbSAndroid Build Coastguard Worker            }
323*b7c941bbSAndroid Build Coastguard Worker        }
324*b7c941bbSAndroid Build Coastguard Worker        public static final class VariantVP9 {
325*b7c941bbSAndroid Build Coastguard Worker            private VariantVP9() {}
326*b7c941bbSAndroid Build Coastguard Worker            public Config720PAndVariantVP9 withConfig720P() {
327*b7c941bbSAndroid Build Coastguard Worker                return new Config720PAndVariantVP9();
328*b7c941bbSAndroid Build Coastguard Worker            }
329*b7c941bbSAndroid Build Coastguard Worker        }
330*b7c941bbSAndroid Build Coastguard Worker        public static final class Config720PAndVariantAV1 {
331*b7c941bbSAndroid Build Coastguard Worker            private Config720PAndVariantAV1() {}
332*b7c941bbSAndroid Build Coastguard Worker            public ConcurrentVideoDecoderSessionsRequirement to(PerformanceClassEvaluator pce) {
333*b7c941bbSAndroid Build Coastguard Worker                return pce.addRequirement(ConcurrentVideoDecoderSessionsRequirement.create720PAV1());
334*b7c941bbSAndroid Build Coastguard Worker            }
335*b7c941bbSAndroid Build Coastguard Worker        }
336*b7c941bbSAndroid Build Coastguard Worker        public static final class Config720PAndVariantVP9 {
337*b7c941bbSAndroid Build Coastguard Worker            private Config720PAndVariantVP9() {}
338*b7c941bbSAndroid Build Coastguard Worker            public ConcurrentVideoDecoderSessionsRequirement to(PerformanceClassEvaluator pce) {
339*b7c941bbSAndroid Build Coastguard Worker                return pce.addRequirement(ConcurrentVideoDecoderSessionsRequirement.create720PVP9());
340*b7c941bbSAndroid Build Coastguard Worker            }
341*b7c941bbSAndroid Build Coastguard Worker        }
342*b7c941bbSAndroid Build Coastguard Worker        public Config1080P withConfig1080P() {
343*b7c941bbSAndroid Build Coastguard Worker            return new Config1080P();
344*b7c941bbSAndroid Build Coastguard Worker        }
345*b7c941bbSAndroid Build Coastguard Worker        public Config4K withConfig4K() {
346*b7c941bbSAndroid Build Coastguard Worker            return new Config4K();
347*b7c941bbSAndroid Build Coastguard Worker        }
348*b7c941bbSAndroid Build Coastguard Worker        public Config720P withConfig720P() {
349*b7c941bbSAndroid Build Coastguard Worker            return new Config720P();
350*b7c941bbSAndroid Build Coastguard Worker        }
351*b7c941bbSAndroid Build Coastguard Worker        public VariantAV1 withVariantAV1() {
352*b7c941bbSAndroid Build Coastguard Worker            return new VariantAV1();
353*b7c941bbSAndroid Build Coastguard Worker        }
354*b7c941bbSAndroid Build Coastguard Worker        public VariantVP9 withVariantVP9() {
355*b7c941bbSAndroid Build Coastguard Worker            return new VariantVP9();
356*b7c941bbSAndroid Build Coastguard Worker        }
357*b7c941bbSAndroid Build Coastguard Worker    }
358*b7c941bbSAndroid Build Coastguard Worker
359*b7c941bbSAndroid Build Coastguard Worker    /**
360*b7c941bbSAndroid Build Coastguard Worker      * 5.1/H-1-2 Concurrent Video Decoder Sessions
361*b7c941bbSAndroid Build Coastguard Worker      *
362*b7c941bbSAndroid Build Coastguard Worker      * Concurrent video decoder sessions
363*b7c941bbSAndroid Build Coastguard Worker      */
364*b7c941bbSAndroid Build Coastguard Worker    private static ConcurrentVideoDecoderSessionsRequirement create1080P() {
365*b7c941bbSAndroid Build Coastguard Worker        var concurrentFps =
366*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Double>builder()
367*b7c941bbSAndroid Build Coastguard Worker                .setId("concurrent_fps")
368*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_GTE)
369*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.TIRAMISU, 171.000000)
370*b7c941bbSAndroid Build Coastguard Worker                .build();
371*b7c941bbSAndroid Build Coastguard Worker        var frameDropsPerSec =
372*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Double>builder()
373*b7c941bbSAndroid Build Coastguard Worker                .setId("frame_drops_per_sec")
374*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_LTE)
375*b7c941bbSAndroid Build Coastguard Worker                .build();
376*b7c941bbSAndroid Build Coastguard Worker        var resolution =
377*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Integer>builder()
378*b7c941bbSAndroid Build Coastguard Worker                .setId("resolution")
379*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.INTEGER_INFO)
380*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.TIRAMISU, 1080)
381*b7c941bbSAndroid Build Coastguard Worker                .build();
382*b7c941bbSAndroid Build Coastguard Worker
383*b7c941bbSAndroid Build Coastguard Worker        ConcurrentVideoDecoderSessionsRequirement req =
384*b7c941bbSAndroid Build Coastguard Worker            new ConcurrentVideoDecoderSessionsRequirement(
385*b7c941bbSAndroid Build Coastguard Worker                "r5_1__h_1_2__1080_p",
386*b7c941bbSAndroid Build Coastguard Worker                concurrentFps,
387*b7c941bbSAndroid Build Coastguard Worker                frameDropsPerSec,
388*b7c941bbSAndroid Build Coastguard Worker                resolution);
389*b7c941bbSAndroid Build Coastguard Worker        req.setMeasuredValue("resolution",1080);
390*b7c941bbSAndroid Build Coastguard Worker        return req;
391*b7c941bbSAndroid Build Coastguard Worker    }
392*b7c941bbSAndroid Build Coastguard Worker
393*b7c941bbSAndroid Build Coastguard Worker    /**
394*b7c941bbSAndroid Build Coastguard Worker      * 5.1/H-1-2 Concurrent Video Decoder Sessions
395*b7c941bbSAndroid Build Coastguard Worker      *
396*b7c941bbSAndroid Build Coastguard Worker      * Concurrent video decoder sessions
397*b7c941bbSAndroid Build Coastguard Worker      */
398*b7c941bbSAndroid Build Coastguard Worker    private static ConcurrentVideoDecoderSessionsRequirement create4K() {
399*b7c941bbSAndroid Build Coastguard Worker        var concurrentFps =
400*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Double>builder()
401*b7c941bbSAndroid Build Coastguard Worker                .setId("concurrent_fps")
402*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_GTE)
403*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.UPSIDE_DOWN_CAKE, 171.000000)
404*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.VANILLA_ICE_CREAM, 171.000000)
405*b7c941bbSAndroid Build Coastguard Worker                .build();
406*b7c941bbSAndroid Build Coastguard Worker        var frameDropsPerSec =
407*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Double>builder()
408*b7c941bbSAndroid Build Coastguard Worker                .setId("frame_drops_per_sec")
409*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_LTE)
410*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.VANILLA_ICE_CREAM, 1.000000)
411*b7c941bbSAndroid Build Coastguard Worker                .build();
412*b7c941bbSAndroid Build Coastguard Worker        var resolution =
413*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Integer>builder()
414*b7c941bbSAndroid Build Coastguard Worker                .setId("resolution")
415*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.INTEGER_INFO)
416*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.UPSIDE_DOWN_CAKE, 2160)
417*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.VANILLA_ICE_CREAM, 2160)
418*b7c941bbSAndroid Build Coastguard Worker                .build();
419*b7c941bbSAndroid Build Coastguard Worker
420*b7c941bbSAndroid Build Coastguard Worker        ConcurrentVideoDecoderSessionsRequirement req =
421*b7c941bbSAndroid Build Coastguard Worker            new ConcurrentVideoDecoderSessionsRequirement(
422*b7c941bbSAndroid Build Coastguard Worker                "r5_1__h_1_2__4_k",
423*b7c941bbSAndroid Build Coastguard Worker                concurrentFps,
424*b7c941bbSAndroid Build Coastguard Worker                frameDropsPerSec,
425*b7c941bbSAndroid Build Coastguard Worker                resolution);
426*b7c941bbSAndroid Build Coastguard Worker        req.setMeasuredValue("resolution",2160);
427*b7c941bbSAndroid Build Coastguard Worker        return req;
428*b7c941bbSAndroid Build Coastguard Worker    }
429*b7c941bbSAndroid Build Coastguard Worker
430*b7c941bbSAndroid Build Coastguard Worker    /**
431*b7c941bbSAndroid Build Coastguard Worker      * 5.1/H-1-2 Concurrent Video Decoder Sessions
432*b7c941bbSAndroid Build Coastguard Worker      *
433*b7c941bbSAndroid Build Coastguard Worker      * Concurrent video decoder sessions
434*b7c941bbSAndroid Build Coastguard Worker      */
435*b7c941bbSAndroid Build Coastguard Worker    private static ConcurrentVideoDecoderSessionsRequirement create720P() {
436*b7c941bbSAndroid Build Coastguard Worker        var concurrentFps =
437*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Double>builder()
438*b7c941bbSAndroid Build Coastguard Worker                .setId("concurrent_fps")
439*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_GTE)
440*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.R, 171.000000)
441*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.S, 171.000000)
442*b7c941bbSAndroid Build Coastguard Worker                .build();
443*b7c941bbSAndroid Build Coastguard Worker        var frameDropsPerSec =
444*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Double>builder()
445*b7c941bbSAndroid Build Coastguard Worker                .setId("frame_drops_per_sec")
446*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_LTE)
447*b7c941bbSAndroid Build Coastguard Worker                .build();
448*b7c941bbSAndroid Build Coastguard Worker        var resolution =
449*b7c941bbSAndroid Build Coastguard Worker            RequiredMeasurement.<Integer>builder()
450*b7c941bbSAndroid Build Coastguard Worker                .setId("resolution")
451*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.INTEGER_INFO)
452*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.R, 720)
453*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.S, 720)
454*b7c941bbSAndroid Build Coastguard Worker                .build();
455*b7c941bbSAndroid Build Coastguard Worker
456*b7c941bbSAndroid Build Coastguard Worker        ConcurrentVideoDecoderSessionsRequirement req =
457*b7c941bbSAndroid Build Coastguard Worker            new ConcurrentVideoDecoderSessionsRequirement(
458*b7c941bbSAndroid Build Coastguard Worker                "r5_1__h_1_2__720_p",
459*b7c941bbSAndroid Build Coastguard Worker                concurrentFps,
460*b7c941bbSAndroid Build Coastguard Worker                frameDropsPerSec,
461*b7c941bbSAndroid Build Coastguard Worker                resolution);
462*b7c941bbSAndroid Build Coastguard Worker        req.setMeasuredValue("resolution",720);
463*b7c941bbSAndroid Build Coastguard Worker        return req;
464*b7c941bbSAndroid Build Coastguard Worker    }
465*b7c941bbSAndroid Build Coastguard Worker
466*b7c941bbSAndroid Build Coastguard Worker    /**
467*b7c941bbSAndroid Build Coastguard Worker      * 5.1/H-1-2 Concurrent Video Decoder Sessions When one of the codecs is AV1, variant used in 720p tests
468*b7c941bbSAndroid Build Coastguard Worker      *
469*b7c941bbSAndroid Build Coastguard Worker      * Concurrent video decoder sessions
470*b7c941bbSAndroid Build Coastguard Worker      */
471*b7c941bbSAndroid Build Coastguard Worker    private static ConcurrentVideoDecoderSessionsRequirement create720PAV1() {
472*b7c941bbSAndroid Build Coastguard Worker        var concurrentFps = RequiredMeasurement
473*b7c941bbSAndroid Build Coastguard Worker                .<Double>builder()
474*b7c941bbSAndroid Build Coastguard Worker                .setId("concurrent_fps")
475*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_GTE)
476*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.S, 171.000000)
477*b7c941bbSAndroid Build Coastguard Worker                .build();
478*b7c941bbSAndroid Build Coastguard Worker        var frameDropsPerSec = RequiredMeasurement
479*b7c941bbSAndroid Build Coastguard Worker                .<Double>builder()
480*b7c941bbSAndroid Build Coastguard Worker                .setId("frame_drops_per_sec")
481*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_LTE)
482*b7c941bbSAndroid Build Coastguard Worker                .build();
483*b7c941bbSAndroid Build Coastguard Worker        var resolution = RequiredMeasurement
484*b7c941bbSAndroid Build Coastguard Worker                .<Integer>builder()
485*b7c941bbSAndroid Build Coastguard Worker                .setId("resolution")
486*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.INTEGER_INFO)
487*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.R, 720)
488*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.S, 720)
489*b7c941bbSAndroid Build Coastguard Worker                .build();
490*b7c941bbSAndroid Build Coastguard Worker        ConcurrentVideoDecoderSessionsRequirement req =
491*b7c941bbSAndroid Build Coastguard Worker            new ConcurrentVideoDecoderSessionsRequirement(
492*b7c941bbSAndroid Build Coastguard Worker                "r5_1__h_1_2",
493*b7c941bbSAndroid Build Coastguard Worker                concurrentFps,
494*b7c941bbSAndroid Build Coastguard Worker                frameDropsPerSec,
495*b7c941bbSAndroid Build Coastguard Worker                resolution);
496*b7c941bbSAndroid Build Coastguard Worker        req.setMeasuredValue("resolution",720);
497*b7c941bbSAndroid Build Coastguard Worker        return req;
498*b7c941bbSAndroid Build Coastguard Worker    }
499*b7c941bbSAndroid Build Coastguard Worker
500*b7c941bbSAndroid Build Coastguard Worker    /**
501*b7c941bbSAndroid Build Coastguard Worker      * 5.1/H-1-2 Concurrent Video Decoder Sessions When one of the codecs is VP9, variant used in 720p tests
502*b7c941bbSAndroid Build Coastguard Worker      *
503*b7c941bbSAndroid Build Coastguard Worker      * Concurrent video decoder sessions
504*b7c941bbSAndroid Build Coastguard Worker      */
505*b7c941bbSAndroid Build Coastguard Worker    private static ConcurrentVideoDecoderSessionsRequirement create720PVP9() {
506*b7c941bbSAndroid Build Coastguard Worker        var concurrentFps = RequiredMeasurement
507*b7c941bbSAndroid Build Coastguard Worker                .<Double>builder()
508*b7c941bbSAndroid Build Coastguard Worker                .setId("concurrent_fps")
509*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_GTE)
510*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.S, 57.000000)
511*b7c941bbSAndroid Build Coastguard Worker                .build();
512*b7c941bbSAndroid Build Coastguard Worker        var frameDropsPerSec = RequiredMeasurement
513*b7c941bbSAndroid Build Coastguard Worker                .<Double>builder()
514*b7c941bbSAndroid Build Coastguard Worker                .setId("frame_drops_per_sec")
515*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.DOUBLE_LTE)
516*b7c941bbSAndroid Build Coastguard Worker                .build();
517*b7c941bbSAndroid Build Coastguard Worker        var resolution = RequiredMeasurement
518*b7c941bbSAndroid Build Coastguard Worker                .<Integer>builder()
519*b7c941bbSAndroid Build Coastguard Worker                .setId("resolution")
520*b7c941bbSAndroid Build Coastguard Worker                .setPredicate(RequirementConstants.INTEGER_INFO)
521*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.R, 720)
522*b7c941bbSAndroid Build Coastguard Worker                .addRequiredValue(VERSION_CODES.S, 720)
523*b7c941bbSAndroid Build Coastguard Worker                .build();
524*b7c941bbSAndroid Build Coastguard Worker        ConcurrentVideoDecoderSessionsRequirement req =
525*b7c941bbSAndroid Build Coastguard Worker            new ConcurrentVideoDecoderSessionsRequirement(
526*b7c941bbSAndroid Build Coastguard Worker                "r5_1__h_1_2",
527*b7c941bbSAndroid Build Coastguard Worker                concurrentFps,
528*b7c941bbSAndroid Build Coastguard Worker                frameDropsPerSec,
529*b7c941bbSAndroid Build Coastguard Worker                resolution);
530*b7c941bbSAndroid Build Coastguard Worker        req.setMeasuredValue("resolution",720);
531*b7c941bbSAndroid Build Coastguard Worker        return req;
532*b7c941bbSAndroid Build Coastguard Worker    }
533*b7c941bbSAndroid Build Coastguard Worker
534*b7c941bbSAndroid Build Coastguard Worker    /** The number of frames per second that can be decoded concurrently */
535*b7c941bbSAndroid Build Coastguard Worker    public void setConcurrentFps(double v) {
536*b7c941bbSAndroid Build Coastguard Worker        this.setMeasuredValue("concurrent_fps", v);
537*b7c941bbSAndroid Build Coastguard Worker    }
538*b7c941bbSAndroid Build Coastguard Worker
539*b7c941bbSAndroid Build Coastguard Worker    /** The number of frames dropped per second */
540*b7c941bbSAndroid Build Coastguard Worker    public void setFrameDropsPerSec(double v) {
541*b7c941bbSAndroid Build Coastguard Worker        this.setMeasuredValue("frame_drops_per_sec", v);
542*b7c941bbSAndroid Build Coastguard Worker    }
543*b7c941bbSAndroid Build Coastguard Worker
544*b7c941bbSAndroid Build Coastguard Worker    /** The resolution the test was run at */
545*b7c941bbSAndroid Build Coastguard Worker    public int getResolution() {
546*b7c941bbSAndroid Build Coastguard Worker        return this.getMeasuredValue("resolution", Integer.class);
547*b7c941bbSAndroid Build Coastguard Worker    }
548*b7c941bbSAndroid Build Coastguard Worker
549*b7c941bbSAndroid Build Coastguard Worker    private ConcurrentVideoDecoderSessionsRequirement(String id, RequiredMeasurement<?>... reqs) {
550*b7c941bbSAndroid Build Coastguard Worker        super(id, reqs);
551*b7c941bbSAndroid Build Coastguard Worker    }
552*b7c941bbSAndroid Build Coastguard Worker}
553*b7c941bbSAndroid Build Coastguard Worker```
554*b7c941bbSAndroid Build Coastguard Worker
555*b7c941bbSAndroid Build Coastguard Worker## Update Test to Report Data Using PerformanceClassEvaluator
556*b7c941bbSAndroid Build Coastguard Worker
557*b7c941bbSAndroid Build Coastguard WorkerNow that we have a requirement defined we just need to update our test to use
558*b7c941bbSAndroid Build Coastguard WorkerPerformanceClassEvaluator.
559*b7c941bbSAndroid Build Coastguard Worker
560*b7c941bbSAndroid Build Coastguard WorkerFirst we need to add the following to our test class: @Rule public final
561*b7c941bbSAndroid Build Coastguard WorkerTestName mTestName = new TestName();
562*b7c941bbSAndroid Build Coastguard Worker
563*b7c941bbSAndroid Build Coastguard Worker### Initializing the Requirement Objects
564*b7c941bbSAndroid Build Coastguard Worker
565*b7c941bbSAndroid Build Coastguard WorkerNext we will create the evaluator and add our newly defined requirement. This
566*b7c941bbSAndroid Build Coastguard Workercan be done at any point during the test, but typically test writers choose to
567*b7c941bbSAndroid Build Coastguard Workerdo this at the end of the test:
568*b7c941bbSAndroid Build Coastguard Worker
569*b7c941bbSAndroid Build Coastguard Worker```
570*b7c941bbSAndroid Build Coastguard WorkerPerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName);
571*b7c941bbSAndroid Build Coastguard WorkerConcurrentVideoDecoderSessionsRequirement r5_1__h_1_2 =
572*b7c941bbSAndroid Build Coastguard Worker    Requirements.addR5_1__H_1_2().withConfigX().withVariantY().to(pce);
573*b7c941bbSAndroid Build Coastguard Worker```
574*b7c941bbSAndroid Build Coastguard Worker
575*b7c941bbSAndroid Build Coastguard WorkerNOTE: `withConfigX` should be replaced with the proper config, ex:
576*b7c941bbSAndroid Build Coastguard Worker`withConfig1080P`. If using the default blank config, this should be left out.
577*b7c941bbSAndroid Build Coastguard Worker
578*b7c941bbSAndroid Build Coastguard WorkerNOTE: `withVariantY` should be replaced with the proper variant, ex:
579*b7c941bbSAndroid Build Coastguard Worker`withVariantVP9`. If the test is not associated with a variant, this should also
580*b7c941bbSAndroid Build Coastguard Workerbe left out.
581*b7c941bbSAndroid Build Coastguard Worker
582*b7c941bbSAndroid Build Coastguard WorkerNOTE: the order configs and variants are specified does not matter, i.e.
583*b7c941bbSAndroid Build Coastguard Worker`withVariantY().withConfigX()` is also valid
584*b7c941bbSAndroid Build Coastguard Worker
585*b7c941bbSAndroid Build Coastguard Worker### Setting the Measured Values
586*b7c941bbSAndroid Build Coastguard Worker
587*b7c941bbSAndroid Build Coastguard WorkerThe generated class for the given requirement also generates with set methods
588*b7c941bbSAndroid Build Coastguard Workerfor each measurement.
589*b7c941bbSAndroid Build Coastguard Worker
590*b7c941bbSAndroid Build Coastguard WorkerAfter the test, once our required measurement(s) have been calculated, we use
591*b7c941bbSAndroid Build Coastguard Workerthe set measurement method(s) generated to report them:
592*b7c941bbSAndroid Build Coastguard Worker
593*b7c941bbSAndroid Build Coastguard Worker```
594*b7c941bbSAndroid Build Coastguard Workerr5_1__H_1_2.setConcurrentFps(achievedFrameRate);
595*b7c941bbSAndroid Build Coastguard Workerr5_1__H_1_2.setFrameDropsPerSec(frameDropsPerSec);
596*b7c941bbSAndroid Build Coastguard Worker```
597*b7c941bbSAndroid Build Coastguard Worker
598*b7c941bbSAndroid Build Coastguard WorkerNOTE: if a measurement is not associated with the specified test config, it does
599*b7c941bbSAndroid Build Coastguard Workernot have to be set.
600*b7c941bbSAndroid Build Coastguard Worker
601*b7c941bbSAndroid Build Coastguard WorkerNOTE: config measurement generate get methods instead of set, and do not need to
602*b7c941bbSAndroid Build Coastguard Workerbe set
603*b7c941bbSAndroid Build Coastguard Worker
604*b7c941bbSAndroid Build Coastguard Worker### Submitting the Test Results
605*b7c941bbSAndroid Build Coastguard Worker
606*b7c941bbSAndroid Build Coastguard WorkerFinally, we just need to submit our results. The submit method should be called
607*b7c941bbSAndroid Build Coastguard Workeronly once at the very end of the test. If we are writing our test CTS, we should
608*b7c941bbSAndroid Build Coastguard Workeruse `submitAndCheck`; if we are writing our test under CTS-Verifier or ITS, we
609*b7c941bbSAndroid Build Coastguard Workershould use `submitAndVerify`. Ex:
610*b7c941bbSAndroid Build Coastguard Worker
611*b7c941bbSAndroid Build Coastguard Worker```
612*b7c941bbSAndroid Build Coastguard Workerpce.submitAndCheck();
613*b7c941bbSAndroid Build Coastguard Worker```
614*b7c941bbSAndroid Build Coastguard Worker
615*b7c941bbSAndroid Build Coastguard WorkerThe test results are then processed and reported creating a file
616*b7c941bbSAndroid Build Coastguard Workermedia_performance_class_test_cases.reportlog.json which will eventually have its
617*b7c941bbSAndroid Build Coastguard Workerdata uploaded and processed.
618*b7c941bbSAndroid Build Coastguard Worker
619*b7c941bbSAndroid Build Coastguard WorkerYou can view the file with
620*b7c941bbSAndroid Build Coastguard Worker
621*b7c941bbSAndroid Build Coastguard Worker```shell
622*b7c941bbSAndroid Build Coastguard Workeradb root
623*b7c941bbSAndroid Build Coastguard Workeradb shell cat /storage/emulated/0/report-log-files/MediaPerformanceClassTestCases.reportlog.json
624*b7c941bbSAndroid Build Coastguard Worker```
625