| 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); | 
|  |