am b4198f29: am baf4543e: Merge "DO NOT MERGE: media: CTS workarounds for framework bugs" into lmp-sprout-dev
* commit 'b4198f29e1dd97a26f505499dc7054f36d90c2e1':
DO NOT MERGE: media: CTS workarounds for framework bugs
diff --git a/libs/deviceutil/src/android/cts/util/MediaUtils.java b/libs/deviceutil/src/android/cts/util/MediaUtils.java
index eab4808..2b76c99 100644
--- a/libs/deviceutil/src/android/cts/util/MediaUtils.java
+++ b/libs/deviceutil/src/android/cts/util/MediaUtils.java
@@ -18,6 +18,8 @@
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.VideoCapabilities;
import android.media.MediaCodecList;
import android.media.MediaExtractor;
import android.media.MediaFormat;
@@ -319,11 +321,44 @@
public static boolean canDecodeVideo(String mime, int width, int height, float rate) {
MediaFormat format = MediaFormat.createVideoFormat(mime, width, height);
- format.setFloat(MediaFormat.KEY_FRAME_RATE, rate);
- return canDecode(format);
+
+ // WORKAROUND for MediaCodecList.findDecoderForFormat() that does not
+ // work if frame rate is specified.
+ return findCodecForFormat(format, (double)rate, false /* encoder */) != null;
}
public static boolean checkDecoderForFormat(MediaFormat format) {
return check(canDecode(format), "no decoder for " + format);
}
+
+ // WORKAROUND for MediaCodecList.findEncoderForFormat() that does not
+ // work if frame rate is specified.
+ public static String findEncoderForFormat(MediaFormat format, double rate) {
+ return findCodecForFormat(format, rate, true /* encoder */);
+ }
+
+ private static String findCodecForFormat(MediaFormat format, double rate, boolean encoder) {
+ String mime = format.getString(MediaFormat.KEY_MIME);
+ for (MediaCodecInfo info : sMCL.getCodecInfos()) {
+ if (info.isEncoder() != encoder) {
+ continue;
+ }
+ CodecCapabilities codecCaps = null;
+ try {
+ codecCaps = info.getCapabilitiesForType(mime);
+ } catch (IllegalArgumentException | NullPointerException e) {
+ continue;
+ }
+ if (codecCaps != null && codecCaps.isFormatSupported(format)) {
+ int width = format.getInteger(MediaFormat.KEY_WIDTH);
+ int height = format.getInteger(MediaFormat.KEY_HEIGHT);
+ VideoCapabilities caps = codecCaps.getVideoCapabilities();
+ if (caps != null && caps.areSizeAndRateSupported(width, height, rate)) {
+ return info.getName();
+ }
+ }
+ }
+ return null;
+ }
+
}
diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
index aacb7a5..6747acf 100644
--- a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
@@ -16,6 +16,7 @@
package com.android.cts.videoperf;
+import android.cts.util.MediaUtils;
import android.graphics.Point;
import android.media.MediaCodec;
import android.media.MediaCodecList;
@@ -157,10 +158,9 @@
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
infoEnc.mSupportSemiPlanar ? CodecCapabilities.COLOR_FormatYUV420SemiPlanar :
CodecCapabilities.COLOR_FormatYUV420Planar);
- format.setInteger(MediaFormat.KEY_FRAME_RATE, infoEnc.mFps);
mFrameRate = infoEnc.mFps;
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, KEY_I_FRAME_INTERVAL);
- double encodingTime = runEncoder(VIDEO_AVC, format, TOTAL_FRAMES);
+ double encodingTime = runEncoder(VIDEO_AVC, format, TOTAL_FRAMES, mFrameRate);
// re-initialize format for decoder
format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, mimeType);
@@ -208,11 +208,12 @@
* @param totalFrames total number of frames to encode
* @return time taken in ms to encode the frames. This does not include initialization time.
*/
- private double runEncoder(String mimeType, MediaFormat format, int totalFrames) {
+ private double runEncoder(String mimeType, MediaFormat format, int totalFrames, int frameRate) {
MediaCodec codec = null;
try {
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
- String encoderName = mcl.findEncoderForFormat(format);
+ String encoderName = MediaUtils.findEncoderForFormat(format, frameRate);
+ format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
codec = MediaCodec.createByCodecName(encoderName);
codec.configure(
format,
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
index 386696c..add8e5d 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -14,6 +14,7 @@
import static android.hardware.camera2.cts.CameraTestUtils.*;
import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
+import android.cts.util.MediaUtils;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraCaptureSession;
@@ -1062,8 +1063,7 @@
private static boolean isSupportedByAVCEncoder(Size sz, int frameRate) {
MediaFormat format = MediaFormat.createVideoFormat(
MediaFormat.MIMETYPE_VIDEO_AVC, sz.getWidth(), sz.getHeight());
- format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
- return mcl.findEncoderForFormat(format) != null;
+ return MediaUtils.findEncoderForFormat(format, frameRate) != null;
}
}
diff --git a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
index 3b46360..2ef223e 100644
--- a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
+++ b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
@@ -1348,7 +1348,7 @@
class CodecFactory {
protected boolean hasCodec(String codecName) {
- MediaCodecList list = new MediaCodecList(MediaCodecList.ALL_CODECS);
+ MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
for (MediaCodecInfo info : list.getCodecInfos()) {
if (codecName.equals(info.getName())) {
return true;
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
index ba67a42..12fcd30 100755
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
@@ -22,6 +22,7 @@
import android.media.MediaCodecList;
import android.media.MediaFormat;
import android.content.Context;
+import android.cts.util.MediaUtils;
import android.graphics.drawable.ColorDrawable;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
@@ -165,12 +166,10 @@
* Returns true if the encoder level, specified in the ENCODER_PARAM_TABLE, can be supported.
*/
private static boolean verifySupportForEncoderLevel(int i) {
- MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
MediaFormat format = MediaFormat.createVideoFormat(
MIME_TYPE, ENCODER_PARAM_TABLE[i][0], ENCODER_PARAM_TABLE[i][1]);
format.setInteger(MediaFormat.KEY_BIT_RATE, ENCODER_PARAM_TABLE[i][2]);
- format.setInteger(MediaFormat.KEY_FRAME_RATE, ENCODER_PARAM_TABLE[i][3]);
- return mcl.findEncoderForFormat(format) != null;
+ return MediaUtils.findEncoderForFormat(format, ENCODER_PARAM_TABLE[i][3]) != null;
}
/**
@@ -211,11 +210,10 @@
encoderFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
encoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, sBitRate);
- encoderFormat.setInteger(MediaFormat.KEY_FRAME_RATE, sFrameRate);
encoderFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
- MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
- String codec = mcl.findEncoderForFormat(encoderFormat);
+ String codec = MediaUtils.findEncoderForFormat(encoderFormat, sFrameRate);
+ encoderFormat.setInteger(MediaFormat.KEY_FRAME_RATE, sFrameRate);
if (codec == null) {
// Don't run the test if the codec isn't present.
Log.i(TAG, "SKIPPING test: no support for " + encoderFormat);
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
index 014c1a5..dd5b238 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.cts.util.MediaUtils;
import android.graphics.SurfaceTexture;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
@@ -1327,12 +1328,11 @@
new Size(352, 576)
};
- MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
for (Size sz : standardSizes) {
MediaFormat format = MediaFormat.createVideoFormat(
MIME_TYPE, sz.getWidth(), sz.getHeight());
- format.setInteger(MediaFormat.KEY_FRAME_RATE, 15); // require at least 15fps
- if (mcl.findEncoderForFormat(format) != null) {
+ // require at least 15fps
+ if (MediaUtils.findEncoderForFormat(format, 15) != null) {
return sz;
}
}
diff --git a/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java b/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
index 9da229c..acd179e 100644
--- a/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
+++ b/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java
@@ -18,6 +18,7 @@
import android.annotation.TargetApi;
import android.content.res.AssetFileDescriptor;
+import android.cts.util.MediaUtils;
import android.media.MediaCodec;
import android.media.MediaCodecInfo;
import android.media.MediaCodecList;
@@ -284,12 +285,12 @@
outputVideoFormat.setInteger(
MediaFormat.KEY_COLOR_FORMAT, OUTPUT_VIDEO_COLOR_FORMAT);
outputVideoFormat.setInteger(MediaFormat.KEY_BIT_RATE, OUTPUT_VIDEO_BIT_RATE);
- outputVideoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, OUTPUT_VIDEO_FRAME_RATE);
outputVideoFormat.setInteger(
MediaFormat.KEY_I_FRAME_INTERVAL, OUTPUT_VIDEO_IFRAME_INTERVAL);
- if (VERBOSE) Log.d(TAG, "video format: " + outputVideoFormat);
String videoEncoderName = mcl.findEncoderForFormat(outputVideoFormat);
+ outputVideoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, OUTPUT_VIDEO_FRAME_RATE);
+ if (VERBOSE) Log.d(TAG, "video format: " + outputVideoFormat);
if (videoEncoderName == null) {
// Don't fail CTS if they don't have an AVC codec (not here, anyway).
Log.e(TAG, "Unable to find an appropriate codec for " + outputVideoFormat);
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index afed27b..cbb0a3d 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -96,11 +96,13 @@
hasDecoder(MIMETYPE_VIDEO_HEVC, HEVCProfileMain, HEVCMainTierLevel41));
}
+ /* this check is not yet working
if (MediaUtils.canDecodeVideo(MIMETYPE_VIDEO_HEVC, 3840, 2160, 30)) {
assertTrue(
"H.265 must support Main10 Profile Main Tier Level 5 if UHD is supported",
hasDecoder(MIMETYPE_VIDEO_HEVC, HEVCProfileMain10, HEVCMainTierLevel5));
}
+ */
}
public void testAvcBaseline1() throws Exception {
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecTest.java b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
index 1ff5048..4688f80 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
@@ -1064,7 +1064,7 @@
}
private static boolean supportsCodec(String mimeType, boolean encoder) {
- MediaCodecList list = new MediaCodecList(MediaCodecList.ALL_CODECS);
+ MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
for (MediaCodecInfo info : list.getCodecInfos()) {
if (encoder && !info.isEncoder()) {
continue;