From 0bdb5dd0a94d0a01b98ee83b280eb16de19d1df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20Kalliom=C3=A4ki?= Date: Wed, 28 Mar 2018 16:31:26 +0200 Subject: [PATCH] Fix framerate based bitrate adjuster. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes target bitrate calculation for framerate based adjuster. Adds new API to bitrate adjuster - getCodecConfigFramerate() - that returns the FPS that should be passed to MediaCodec on initialization. Bug: b/73741487, cl/186656928 Change-Id: Ia4a5e99d302de67fbee0c132ab8e9392bc205b44 Reviewed-on: https://webrtc-review.googlesource.com/65162 Reviewed-by: Magnus Jedvert Commit-Queue: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#22716} --- sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java | 2 +- sdk/android/src/java/org/webrtc/BitrateAdjuster.java | 4 ++-- .../src/java/org/webrtc/DynamicBitrateAdjuster.java | 9 ++++++--- .../src/java/org/webrtc/FramerateBitrateAdjuster.java | 7 ++++++- .../src/java/org/webrtc/HardwareVideoEncoder.java | 4 ++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java b/sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java index ca9ebb52a8..19cf5ea38a 100644 --- a/sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java +++ b/sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java @@ -32,7 +32,7 @@ class BaseBitrateAdjuster implements BitrateAdjuster { } @Override - public int getAdjustedFramerate() { + public int getCodecConfigFramerate() { return targetFps; } } diff --git a/sdk/android/src/java/org/webrtc/BitrateAdjuster.java b/sdk/android/src/java/org/webrtc/BitrateAdjuster.java index 044a43a1eb..854ef067e5 100644 --- a/sdk/android/src/java/org/webrtc/BitrateAdjuster.java +++ b/sdk/android/src/java/org/webrtc/BitrateAdjuster.java @@ -26,6 +26,6 @@ interface BitrateAdjuster { /** Gets the current bitrate. */ int getAdjustedBitrateBps(); - /** Gets the current framerate. */ - int getAdjustedFramerate(); + /** Gets the framerate for initial codec configuration. */ + int getCodecConfigFramerate(); } diff --git a/sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java b/sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java index 742cfad7b6..1f970bbbbd 100644 --- a/sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java +++ b/sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java @@ -86,10 +86,13 @@ class DynamicBitrateAdjuster extends BaseBitrateAdjuster { timeSinceLastAdjustmentMs = 0; } + private double getBitrateAdjustmentScale() { + return Math.pow(BITRATE_ADJUSTMENT_MAX_SCALE, + (double) bitrateAdjustmentScaleExp / BITRATE_ADJUSTMENT_STEPS); + } + @Override public int getAdjustedBitrateBps() { - return (int) (targetBitrateBps - * Math.pow(BITRATE_ADJUSTMENT_MAX_SCALE, - (double) bitrateAdjustmentScaleExp / BITRATE_ADJUSTMENT_STEPS)); + return (int) (targetBitrateBps * getBitrateAdjustmentScale()); } } diff --git a/sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java b/sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java index a0a0664bf6..b9d1af66c0 100644 --- a/sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java +++ b/sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java @@ -25,6 +25,11 @@ class FramerateBitrateAdjuster extends BaseBitrateAdjuster { } super.setTargets(targetBitrateBps, targetFps); - this.targetBitrateBps *= INITIAL_FPS / this.targetFps; + this.targetBitrateBps = this.targetBitrateBps * INITIAL_FPS / this.targetFps; + } + + @Override + public int getCodecConfigFramerate() { + return INITIAL_FPS; } } diff --git a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java index 7a05f37791..9b895cc993 100644 --- a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java +++ b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java @@ -17,7 +17,6 @@ import android.media.MediaCodecInfo; import android.media.MediaFormat; import android.opengl.GLES20; import android.os.Bundle; -import javax.annotation.Nullable; import android.view.Surface; import java.io.IOException; import java.nio.ByteBuffer; @@ -26,6 +25,7 @@ import java.util.Map; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; import org.webrtc.ThreadUtils.ThreadChecker; /** Android hardware video encoder. */ @@ -186,7 +186,7 @@ class HardwareVideoEncoder implements VideoEncoder { format.setInteger(MediaFormat.KEY_BIT_RATE, adjustedBitrate); format.setInteger(KEY_BITRATE_MODE, VIDEO_ControlRateConstant); format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat); - format.setInteger(MediaFormat.KEY_FRAME_RATE, bitrateAdjuster.getAdjustedFramerate()); + format.setInteger(MediaFormat.KEY_FRAME_RATE, bitrateAdjuster.getCodecConfigFramerate()); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec); if (codecType == VideoCodecType.H264) { String profileLevelId = params.get(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID);