From 5df6a5815ab10773f267f6e3d56ef847a12f9fcf Mon Sep 17 00:00:00 2001 From: samrobinson Date: Fri, 6 May 2022 16:03:18 +0100 Subject: [PATCH] Match the suggested bitrate to the actual Kush Gauge formula. As defined in Kush Amerasinghe's paper 'H.264 For the rest of us'. PiperOrigin-RevId: 446988272 --- .../transformer/DefaultEncoderFactory.java | 19 ++++++++++++++++--- .../DefaultEncoderFactoryTest.java | 8 ++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactory.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactory.java index 8f273e81d8..e1d4c159f3 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactory.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactory.java @@ -502,11 +502,24 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { && allowedMimeTypes.contains(mimeType); } - /** Computes the video bit rate using the Kush Gauge. */ + /** + * Computes the video bit rate using the Kush Gauge. + * + *

{@code kushGaugeBitrate = height * width * frameRate * 0.07 * motionFactor}. + * + *

Motion factors: + * + *

+ */ private static int getSuggestedBitrate(int width, int height, float frameRate) { // TODO(b/210591626) Implement bitrate estimation. - // 1080p30 -> 6.2Mbps, 720p30 -> 2.7Mbps. - return (int) (width * height * frameRate * 0.1); + // Assume medium motion factor. + // 1080p60 -> 16.6Mbps, 720p30 -> 3.7Mbps. + return (int) (width * height * frameRate * 0.07 * 2); } @RequiresNonNull("#1.sampleMimeType") diff --git a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactoryTest.java b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactoryTest.java index c7d239d2a7..249c231639 100644 --- a/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactoryTest.java +++ b/library/transformer/src/test/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactoryTest.java @@ -74,8 +74,8 @@ public class DefaultEncoderFactoryTest { assertThat(actualVideoFormat.sampleMimeType).isEqualTo(MimeTypes.VIDEO_H264); assertThat(actualVideoFormat.width).isEqualTo(1920); assertThat(actualVideoFormat.height).isEqualTo(1080); - // 1920 * 1080 * 30 * 0.1 - assertThat(actualVideoFormat.averageBitrate).isEqualTo(6_220_800); + // 1920 * 1080 * 30 * 0.07 * 2. + assertThat(actualVideoFormat.averageBitrate).isEqualTo(8_709_120); } @Test @@ -92,8 +92,8 @@ public class DefaultEncoderFactoryTest { assertThat(actualVideoFormat.sampleMimeType).isEqualTo(MimeTypes.VIDEO_H264); assertThat(actualVideoFormat.width).isEqualTo(1920); assertThat(actualVideoFormat.height).isEqualTo(1080); - // 1920 * 1080 * 30 * 0.1 - assertThat(actualVideoFormat.averageBitrate).isEqualTo(6_220_800); + // 1920 * 1080 * 30 * 0.07 * 2. + assertThat(actualVideoFormat.averageBitrate).isEqualTo(8_709_120); } @Test