diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java index 3177166e95..b750b00289 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/MediaCodecAdapterWrapper.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.transformer; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkState; +import static java.lang.Math.ceil; import android.media.MediaCodec; import android.media.MediaCodec.BufferInfo; @@ -38,6 +39,7 @@ import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Map; import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @@ -199,21 +201,30 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * MediaCodecAdapter} video encoder. * * @param format The {@link Format} (of the output data) used to determine the underlying {@link - * MediaCodec} and its configuration values. + * MediaCodec} and its configuration values. {@link Format#width}, {@link Format#height}, + * {@link Format#frameRate} and {@link Format#averageBitrate} must be set to those of the + * desired output video format. + * @param additionalEncoderConfig A map of {@link MediaFormat}'s integer settings, where the keys + * are from {@code MediaFormat.KEY_*} constants. Its values will override those in {@code + * format}. * @return A configured and started encoder wrapper. * @throws IOException If the underlying codec cannot be created. */ - public static MediaCodecAdapterWrapper createForVideoEncoding(Format format) throws IOException { + public static MediaCodecAdapterWrapper createForVideoEncoding( + Format format, Map additionalEncoderConfig) throws IOException { @Nullable MediaCodecAdapter adapter = null; try { MediaFormat mediaFormat = MediaFormat.createVideoFormat( checkNotNull(format.sampleMimeType), format.width, format.height); - // TODO(claincly): enable configuration. mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, CodecCapabilities.COLOR_FormatSurface); - mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30); + mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, (int) ceil(format.frameRate)); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); - mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 5_000_000); + mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, format.averageBitrate); + + for (Map.Entry encoderSetting : additionalEncoderConfig.entrySet()) { + mediaFormat.setInteger(encoderSetting.getKey(), encoderSetting.getValue()); + } adapter = new Factory() diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java index 7ed1afef1b..88e04a0b70 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerTranscodingVideoRenderer.java @@ -39,6 +39,7 @@ import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.GlUtil; +import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.nio.ByteBuffer; @@ -158,7 +159,9 @@ import java.nio.ByteBuffer; } try { - encoder = MediaCodecAdapterWrapper.createForVideoEncoding(encoderConfigurationOutputFormat); + encoder = + MediaCodecAdapterWrapper.createForVideoEncoding( + encoderConfigurationOutputFormat, ImmutableMap.of()); } catch (IOException e) { throw createRendererException( // TODO(claincly): should be "ENCODER_INIT_FAILED"