Fix NPE when calling CodecCapabilities.createFromProfileLevel
CodecCapabilities.createFromProfileLevel ended up calling
MediaCodecList.native_getGlobalSettings, which did not have an implementation
in Robolectric, and thus caused a NPE when called. Add a basic implementation
for it that just returns an empty Map.
PiperOrigin-RevId: 343132058
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaCodecListTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaCodecListTest.java
index 421aa5b..2f5b2af 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaCodecListTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaCodecListTest.java
@@ -104,4 +104,19 @@
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
assertThat(mediaCodecList.getCodecInfos()).hasLength(0);
}
+
+ @Test
+ public void codecCapabilities_createFromProfileLevel() {
+ CodecCapabilities codecCapabilities =
+ CodecCapabilities.createFromProfileLevel(
+ MediaFormat.MIMETYPE_VIDEO_AVC,
+ CodecProfileLevel.AVCProfileBaseline,
+ CodecProfileLevel.AVCLevel2);
+ CodecProfileLevel expected = new CodecProfileLevel();
+ expected.profile = CodecProfileLevel.AVCProfileBaseline;
+ expected.level = CodecProfileLevel.AVCLevel2;
+ assertThat(codecCapabilities.getMimeType()).isEqualTo(MediaFormat.MIMETYPE_VIDEO_AVC);
+ assertThat(codecCapabilities.profileLevels).hasLength(1);
+ assertThat(codecCapabilities.profileLevels[0]).isEqualTo(expected);
+ }
}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMediaCodecList.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMediaCodecList.java
index 0d1f6b7..d16fd12 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMediaCodecList.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowMediaCodecList.java
@@ -1,6 +1,7 @@
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
+import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.Q;
import android.annotation.TargetApi;
@@ -8,7 +9,9 @@
import android.media.MediaCodecList;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
@@ -53,4 +56,9 @@
protected static MediaCodecInfo getNewCodecInfoAt(int index) {
return mediaCodecInfos.get(index);
}
+
+ @Implementation(minSdk = M)
+ protected static Map<String, Object> native_getGlobalSettings() {
+ return new HashMap<>();
+ }
}