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