| Index: media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
|
| diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
|
| index d8fc12ff848cb83bac72cbd15d4eadb2dcd0bb4f..ecc90018c2082a81a8690e084c629be3028ee3b7 100644
|
| --- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
|
| +++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
|
| @@ -17,6 +17,7 @@ import org.chromium.base.Log;
|
| import org.chromium.base.annotations.CalledByNative;
|
| import org.chromium.base.annotations.JNINamespace;
|
| import org.chromium.base.annotations.MainDex;
|
| +import org.chromium.media.MediaCodecUtil.BitrateAdjustmentTypes;
|
| import org.chromium.media.MediaCodecUtil.MimeTypes;
|
|
|
| import java.nio.ByteBuffer;
|
| @@ -59,6 +60,9 @@ class MediaCodecBridge {
|
| private static final String KEY_CROP_BOTTOM = "crop-bottom";
|
| private static final String KEY_CROP_TOP = "crop-top";
|
|
|
| + private static final int BITRATE_ADJUSTMENT_FPS = 30;
|
| + private static final int MAXIMUM_INITIAL_FPS = 30;
|
| +
|
| private ByteBuffer[] mInputBuffers;
|
| private ByteBuffer[] mOutputBuffers;
|
|
|
| @@ -68,6 +72,8 @@ class MediaCodecBridge {
|
| private String mMime;
|
| private boolean mAdaptivePlaybackSupported;
|
|
|
| + private BitrateAdjustmentTypes mBitrateAdjustmentType = BitrateAdjustmentTypes.NO_ADJUSTMENT;
|
| +
|
| @MainDex
|
| private static class DequeueInputResult {
|
| private final int mStatus;
|
| @@ -186,14 +192,15 @@ class MediaCodecBridge {
|
| }
|
| }
|
|
|
| - private MediaCodecBridge(
|
| - MediaCodec mediaCodec, String mime, boolean adaptivePlaybackSupported) {
|
| + private MediaCodecBridge(MediaCodec mediaCodec, String mime, boolean adaptivePlaybackSupported,
|
| + BitrateAdjustmentTypes bitrateAdjustmentType) {
|
| assert mediaCodec != null;
|
| mMediaCodec = mediaCodec;
|
| mMime = mime;
|
| mLastPresentationTimeUs = 0;
|
| mFlushed = true;
|
| mAdaptivePlaybackSupported = adaptivePlaybackSupported;
|
| + mBitrateAdjustmentType = bitrateAdjustmentType;
|
| }
|
|
|
| @CalledByNative
|
| @@ -214,7 +221,8 @@ class MediaCodecBridge {
|
|
|
| if (info.mediaCodec == null) return null;
|
|
|
| - return new MediaCodecBridge(info.mediaCodec, mime, info.supportsAdaptivePlayback);
|
| + return new MediaCodecBridge(
|
| + info.mediaCodec, mime, info.supportsAdaptivePlayback, info.bitrateAdjustmentType);
|
| }
|
|
|
| @CalledByNative
|
| @@ -353,11 +361,18 @@ class MediaCodecBridge {
|
|
|
| @TargetApi(Build.VERSION_CODES.KITKAT)
|
| @CalledByNative
|
| - private void setVideoBitrate(int bps) {
|
| + private void setVideoBitrate(int bps, int frameRate) {
|
| + int targetBps = bps;
|
| + if (mBitrateAdjustmentType == BitrateAdjustmentTypes.FRAMERATE_ADJUSTMENT
|
| + && frameRate > 0) {
|
| + targetBps = BITRATE_ADJUSTMENT_FPS * bps / frameRate;
|
| + }
|
| +
|
| Bundle b = new Bundle();
|
| - b.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, bps);
|
| + b.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, targetBps);
|
| mMediaCodec.setParameters(b);
|
| - Log.v(TAG, "setVideoBitrate " + bps);
|
| + Log.v(TAG,
|
| + "setVideoBitrate: input " + bps + "bps@" + frameRate + ", targetBps " + targetBps);
|
| }
|
|
|
| @TargetApi(Build.VERSION_CODES.KITKAT)
|
| @@ -538,8 +553,14 @@ class MediaCodecBridge {
|
| }
|
|
|
| @CalledByNative
|
| - private static MediaFormat createVideoEncoderFormat(String mime, int width, int height,
|
| - int bitRate, int frameRate, int iFrameInterval, int colorFormat) {
|
| + private MediaFormat createVideoEncoderFormat(String mime, int width, int height, int bitRate,
|
| + int frameRate, int iFrameInterval, int colorFormat) {
|
| + if (mBitrateAdjustmentType == BitrateAdjustmentTypes.FRAMERATE_ADJUSTMENT) {
|
| + frameRate = BITRATE_ADJUSTMENT_FPS;
|
| + } else {
|
| + frameRate = Math.min(frameRate, MAXIMUM_INITIAL_FPS);
|
| + }
|
| +
|
| MediaFormat format = MediaFormat.createVideoFormat(mime, width, height);
|
| format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
|
| format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
|
|
|