MediaCodec CTS: validate metrics

Bug: 147573846
Test: atest android.mediav2.cts.CodecEncoderTest \
android.mediav2.cts.CodecDecoderTest

Change-Id: I93ec0182586f01d93d73ff8cc844118e5a68b628
Merged-In: I93ec0182586f01d93d73ff8cc844118e5a68b628
diff --git a/tests/media/src/android/mediav2/cts/CodecDecoderTest.java b/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
index 1317e60..1fc3126 100644
--- a/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecDecoderTest.java
@@ -23,6 +23,7 @@
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.os.Build;
+import android.os.PersistableBundle;
 import android.util.Log;
 import android.util.Pair;
 
@@ -323,6 +324,14 @@
         mSaveToMem = false;
     }
 
+    @Override
+    PersistableBundle validateMetrics(String decoder, MediaFormat format) {
+        PersistableBundle metrics = super.validateMetrics(decoder, format);
+        assertTrue(metrics.getString(MediaCodec.MetricsConstants.MIME_TYPE).equals(mMime));
+        assertTrue(metrics.getInt(MediaCodec.MetricsConstants.ENCODER) == 0);
+        return metrics;
+    }
+
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
         final List<String> cddRequiredMimeList =
@@ -469,6 +478,7 @@
                     mCodec.getName().equals(decoder));
             assertTrue("error! codec canonical name is null",
                     mCodec.getCanonicalName() != null && !mCodec.getCanonicalName().isEmpty());
+            validateMetrics(decoder);
             int loopCounter = 0;
             for (boolean eosType : boolStates) {
                 for (boolean isAsync : boolStates) {
@@ -491,6 +501,7 @@
                     doWork(Integer.MAX_VALUE);
                     queueEOS();
                     waitForAllOutputs();
+                    validateMetrics(decoder, format);
                     /* TODO(b/147348711) */
                     if (false) mCodec.stop();
                     else mCodec.reset();
@@ -604,8 +615,11 @@
                 assertTrue(log + " pts is not strictly increasing",
                         test.isPtsStrictlyIncreasing(mPrevOutputPts));
 
+                boolean checkMetrics = (mOutputCount != 0);
+
                 /* test flush in running state */
                 flushCodec();
+                if (checkMetrics) validateMetrics(decoder, format);
                 if (mIsCodecInAsyncMode) mCodec.start();
                 mSaveToMem = true;
                 test.reset();
@@ -719,14 +733,17 @@
                 mCodec.start();
                 doWork(23);
 
-                if (validateFormat) {
-                    assertTrue(log + "not received format change",
-                            mIsCodecInAsyncMode ? mAsyncHandle.hasOutputFormatChanged() :
-                                    mSignalledOutFormatChanged);
-                    assertTrue(log + "configured format and output format are not similar",
-                            isFormatSimilar(format,
-                                    mIsCodecInAsyncMode ? mAsyncHandle.getOutputFormat() :
-                                            mOutFormat));
+                if (mOutputCount != 0) {
+                    if (validateFormat) {
+                        assertTrue(log + "not received format change",
+                                mIsCodecInAsyncMode ? mAsyncHandle.hasOutputFormatChanged() :
+                                        mSignalledOutFormatChanged);
+                        assertTrue(log + "configured format and output format are not similar",
+                                isFormatSimilar(format,
+                                        mIsCodecInAsyncMode ? mAsyncHandle.getOutputFormat() :
+                                                mOutFormat));
+                    }
+                    validateMetrics(decoder, format);
                 }
 
                 /* test reconfigure codec in running state */
@@ -806,6 +823,7 @@
                 doWork(Integer.MAX_VALUE);
                 queueEOS();
                 waitForAllOutputs();
+                validateMetrics(decoder, newFormat);
                 /* TODO(b/147348711) */
                 if (false) mCodec.stop();
                 else mCodec.reset();
@@ -935,6 +953,7 @@
                         doWork(Integer.MAX_VALUE);
                         queueEOS();
                         waitForAllOutputs();
+                        validateMetrics(decoder);
                         /* TODO(b/147348711) */
                         if (false) mCodec.stop();
                         else mCodec.reset();
diff --git a/tests/media/src/android/mediav2/cts/CodecEncoderTest.java b/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
index 45cac5d..3bce40c 100644
--- a/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
+++ b/tests/media/src/android/mediav2/cts/CodecEncoderTest.java
@@ -23,6 +23,7 @@
 import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.os.Build;
+import android.os.PersistableBundle;
 import android.util.Log;
 
 import androidx.test.filters.LargeTest;
@@ -304,6 +305,14 @@
         mSaveToMem = false;
     }
 
+    @Override
+    PersistableBundle validateMetrics(String codec, MediaFormat format) {
+        PersistableBundle metrics = super.validateMetrics(codec, format);
+        assertTrue(metrics.getString(MediaCodec.MetricsConstants.MIME_TYPE).equals(mMime));
+        assertTrue(metrics.getInt(MediaCodec.MetricsConstants.ENCODER) == 1);
+        return metrics;
+    }
+
     @Parameterized.Parameters(name = "{index}({0})")
     public static Collection<Object[]> input() {
         final List<String> cddRequiredMimeList =
@@ -475,11 +484,13 @@
                                 (eosType ? "eos with last frame" : "eos separate"));
                         mOutputBuff = loopCounter == 0 ? ref : test;
                         mOutputBuff.reset();
+                        validateMetrics(encoder);
                         configureCodec(format, isAsync, eosType, true);
                         mCodec.start();
                         doWork(Integer.MAX_VALUE);
                         queueEOS();
                         waitForAllOutputs();
+                        validateMetrics(encoder, format);
                         /* TODO(b/147348711) */
                         if (false) mCodec.stop();
                         else mCodec.reset();
@@ -549,10 +560,13 @@
                 assertTrue(log + " pts is not strictly increasing",
                         mOutputBuff.isPtsStrictlyIncreasing(mPrevOutputPts));
 
+                boolean checkMetrics = (mOutputCount != 0);
+
                 /* test flush in running state */
                 flushCodec();
                 mOutputBuff.reset();
                 if (mIsCodecInAsyncMode) mCodec.start();
+                if (checkMetrics) validateMetrics(encoder, inpFormat);
                 doWork(Integer.MAX_VALUE);
                 queueEOS();
                 waitForAllOutputs();
@@ -646,6 +660,8 @@
                 mCodec.start();
                 doWork(23);
 
+                if (mOutputCount != 0) validateMetrics(encoder, format);
+
                 /* test reconfigure codec in running state */
                 reConfigureCodec(format, isAsync, true, true);
                 mCodec.start();
diff --git a/tests/media/src/android/mediav2/cts/CodecTestBase.java b/tests/media/src/android/mediav2/cts/CodecTestBase.java
index f4568fa..a30a239 100644
--- a/tests/media/src/android/mediav2/cts/CodecTestBase.java
+++ b/tests/media/src/android/mediav2/cts/CodecTestBase.java
@@ -24,6 +24,7 @@
 import android.media.MediaCodecList;
 import android.media.MediaFormat;
 import android.os.Build;
+import android.os.PersistableBundle;
 import android.util.Log;
 import android.util.Pair;
 
@@ -686,4 +687,28 @@
         }
         return true;
     }
+
+    PersistableBundle validateMetrics(String codec) {
+        PersistableBundle metrics = mCodec.getMetrics();
+        assertTrue("metrics is null", metrics != null);
+        assertTrue(metrics.getString(MediaCodec.MetricsConstants.CODEC).equals(codec));
+        if (mIsAudio) {
+            assertTrue(metrics.getString(MediaCodec.MetricsConstants.MODE)
+                    .equals(MediaCodec.MetricsConstants.MODE_AUDIO));
+        } else {
+            assertTrue(metrics.getString(MediaCodec.MetricsConstants.MODE)
+                    .equals(MediaCodec.MetricsConstants.MODE_VIDEO));
+        }
+        return metrics;
+    }
+
+    PersistableBundle validateMetrics(String codec, MediaFormat format) {
+        PersistableBundle metrics = validateMetrics(codec);
+        if (!mIsAudio) {
+            assertTrue(metrics.getInt(MediaCodec.MetricsConstants.WIDTH) == getWidth(format));
+            assertTrue(metrics.getInt(MediaCodec.MetricsConstants.HEIGHT) == getHeight(format));
+        }
+        assertTrue(metrics.getInt(MediaCodec.MetricsConstants.SECURE) == 0);
+        return metrics;
+    }
 }