Allow configuring encoder.
PiperOrigin-RevId: 400151886
This commit is contained in:
parent
7a3dedce07
commit
d4343ed858
@ -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<String, Integer> 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<String, Integer> encoderSetting : additionalEncoderConfig.entrySet()) {
|
||||
mediaFormat.setInteger(encoderSetting.getKey(), encoderSetting.getValue());
|
||||
}
|
||||
|
||||
adapter =
|
||||
new Factory()
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user