| Index: media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
|
| diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
|
| index e3673d73aa5ed0f86e03d1d93df5fed0ceecedd1..93da01007a8e9ec701e86e17021fc0f1c0a0d4c0 100644
|
| --- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
|
| +++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
|
| @@ -37,6 +37,7 @@ class MediaCodecUtil {
|
| public static class CodecCreationInfo {
|
| public MediaCodec mediaCodec = null;
|
| public boolean supportsAdaptivePlayback = false;
|
| + public BitrateAdjustmentTypes bitrateAdjustmentType = BitrateAdjustmentTypes.NO_ADJUSTMENT;
|
| }
|
|
|
| @MainDex
|
| @@ -49,6 +50,17 @@ class MediaCodecUtil {
|
| public static final String VIDEO_VP9 = "video/x-vnd.on2.vp9";
|
| }
|
|
|
| + // Type of bitrate adjustment for video encoder.
|
| + @MainDex
|
| + public enum BitrateAdjustmentTypes {
|
| + // No adjustment - video encoder has no known bitrate problem.
|
| + NO_ADJUSTMENT,
|
| + // Framerate based bitrate adjustment is required - HW encoder does not use frame
|
| + // timestamps to calculate frame bitrate budget and instead is relying on initial
|
| + // fps configuration assuming that all frames are coming at fixed initial frame rate.
|
| + FRAMERATE_ADJUSTMENT,
|
| + }
|
| +
|
| /**
|
| * Class to abstract platform version API differences for interacting with
|
| * the MediaCodecList.
|
| @@ -361,19 +373,26 @@ class MediaCodecUtil {
|
|
|
| // List of supported HW encoders.
|
| private static enum HWEncoderProperties {
|
| - QcomVp8(MimeTypes.VIDEO_VP8, "OMX.qcom.", Build.VERSION_CODES.KITKAT),
|
| - QcomH264(MimeTypes.VIDEO_H264, "OMX.qcom.", Build.VERSION_CODES.KITKAT),
|
| - ExynosVp8(MimeTypes.VIDEO_VP8, "OMX.Exynos.", Build.VERSION_CODES.M),
|
| - ExynosH264(MimeTypes.VIDEO_H264, "OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP);
|
| + QcomVp8(MimeTypes.VIDEO_VP8, "OMX.qcom.", Build.VERSION_CODES.KITKAT,
|
| + BitrateAdjustmentTypes.NO_ADJUSTMENT),
|
| + QcomH264(MimeTypes.VIDEO_H264, "OMX.qcom.", Build.VERSION_CODES.KITKAT,
|
| + BitrateAdjustmentTypes.NO_ADJUSTMENT),
|
| + ExynosVp8(MimeTypes.VIDEO_VP8, "OMX.Exynos.", Build.VERSION_CODES.M,
|
| + BitrateAdjustmentTypes.NO_ADJUSTMENT),
|
| + ExynosH264(MimeTypes.VIDEO_H264, "OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP,
|
| + BitrateAdjustmentTypes.FRAMERATE_ADJUSTMENT);
|
|
|
| private final String mMime;
|
| private final String mPrefix;
|
| private final int mMinSDK;
|
| + private final BitrateAdjustmentTypes mBitrateAdjustmentType;
|
|
|
| - private HWEncoderProperties(String mime, String prefix, int minSDK) {
|
| + private HWEncoderProperties(String mime, String prefix, int minSDK,
|
| + BitrateAdjustmentTypes bitrateAdjustmentType) {
|
| this.mMime = mime;
|
| this.mPrefix = prefix;
|
| this.mMinSDK = minSDK;
|
| + this.mBitrateAdjustmentType = bitrateAdjustmentType;
|
| }
|
|
|
| public String getMime() {
|
| @@ -387,6 +406,10 @@ class MediaCodecUtil {
|
| public int getMinSDK() {
|
| return mMinSDK;
|
| }
|
| +
|
| + public BitrateAdjustmentTypes getBitrateAdjustmentType() {
|
| + return mBitrateAdjustmentType;
|
| + }
|
| }
|
|
|
| // List of devices with poor H.264 encoder quality.
|
| @@ -405,11 +428,15 @@ class MediaCodecUtil {
|
| // if we cannot create the codec.
|
| CodecCreationInfo result = new CodecCreationInfo();
|
|
|
| - if (!isEncoderSupportedByDevice(mime)) return result;
|
| + HWEncoderProperties encoderProperties = findHWEncoder(mime);
|
| + if (encoderProperties == null) {
|
| + return result;
|
| + }
|
|
|
| try {
|
| result.mediaCodec = MediaCodec.createEncoderByType(mime);
|
| result.supportsAdaptivePlayback = false;
|
| + result.bitrateAdjustmentType = encoderProperties.getBitrateAdjustmentType();
|
| } catch (Exception e) {
|
| Log.e(TAG, "Failed to create MediaCodec: %s", mime, e);
|
| }
|
| @@ -439,6 +466,19 @@ class MediaCodecUtil {
|
| }
|
| }
|
|
|
| + if (findHWEncoder(mime) == null) {
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * Find HW encoder with given MIME type.
|
| + * @param mime MIME type of the media.
|
| + * @return HWEncoderProperties object.
|
| + */
|
| + private static HWEncoderProperties findHWEncoder(String mime) {
|
| MediaCodecListHelper codecListHelper = new MediaCodecListHelper();
|
| int codecCount = codecListHelper.getCodecCount();
|
| for (int i = 0; i < codecCount; ++i) {
|
| @@ -469,12 +509,12 @@ class MediaCodecUtil {
|
| continue;
|
| }
|
| Log.d(TAG, "Found target encoder for mime " + mime + " : " + encoderName);
|
| - return true;
|
| + return codecProperties;
|
| }
|
| }
|
| }
|
|
|
| Log.w(TAG, "HW encoder for " + mime + " is not available on this device.");
|
| - return false;
|
| + return null;
|
| }
|
| }
|
|
|