From ff7629aba5a519afd590259853cf2651c5b39445 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/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java index 5ec10391ec..ff638e8eb8 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java @@ -504,11 +504,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/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java index 6fd88d043b..4078e3eeb4 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/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