Add option to disable encoder fallback.
We use the top priority encoder (sorted by EncoderSelector) and the requested output format for encoding. PiperOrigin-RevId: 426191800
This commit is contained in:
parent
7507da51a0
commit
e2d4bd15cd
@ -18,7 +18,6 @@ package androidx.media3.transformer;
|
|||||||
|
|
||||||
import static androidx.media3.common.util.Assertions.checkArgument;
|
import static androidx.media3.common.util.Assertions.checkArgument;
|
||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.common.util.Assertions.checkState;
|
|
||||||
import static androidx.media3.common.util.Assertions.checkStateNotNull;
|
import static androidx.media3.common.util.Assertions.checkStateNotNull;
|
||||||
import static androidx.media3.common.util.Util.SDK_INT;
|
import static androidx.media3.common.util.Util.SDK_INT;
|
||||||
import static androidx.media3.transformer.CodecFactoryUtil.createCodec;
|
import static androidx.media3.transformer.CodecFactoryUtil.createCodec;
|
||||||
@ -41,22 +40,32 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
|||||||
/** A default implementation of {@link Codec.EncoderFactory}. */
|
/** A default implementation of {@link Codec.EncoderFactory}. */
|
||||||
@UnstableApi
|
@UnstableApi
|
||||||
public final class DefaultEncoderFactory implements Codec.EncoderFactory {
|
public final class DefaultEncoderFactory implements Codec.EncoderFactory {
|
||||||
// TODO(b/214973843): Add option to disable fallback.
|
|
||||||
private static final int DEFAULT_COLOR_FORMAT =
|
private static final int DEFAULT_COLOR_FORMAT =
|
||||||
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
|
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface;
|
||||||
private static final int DEFAULT_FRAME_RATE = 60;
|
private static final int DEFAULT_FRAME_RATE = 60;
|
||||||
private static final int DEFAULT_I_FRAME_INTERVAL_SECS = 1;
|
private static final int DEFAULT_I_FRAME_INTERVAL_SECS = 1;
|
||||||
|
|
||||||
@Nullable private final EncoderSelector videoEncoderSelector;
|
@Nullable private final EncoderSelector videoEncoderSelector;
|
||||||
|
private final boolean disableFallback;
|
||||||
|
|
||||||
/** Creates a new instance using the {@link EncoderSelector#DEFAULT default encoder selector}. */
|
/**
|
||||||
|
* Creates a new instance using the {@link EncoderSelector#DEFAULT default encoder selector}, and
|
||||||
|
* format fallback enabled.
|
||||||
|
*
|
||||||
|
* <p>With format fallback enabled, and when the requested {@link Format} is not supported, {@code
|
||||||
|
* DefaultEncoderFactory} finds a format that is supported by the device and configures the {@link
|
||||||
|
* Codec} with it. The fallback process may change the requested {@link Format#sampleMimeType MIME
|
||||||
|
* type}, resolution, {@link Format#bitrate bitrate}, {@link Format#codecs profile/level}, etc.
|
||||||
|
*/
|
||||||
public DefaultEncoderFactory() {
|
public DefaultEncoderFactory() {
|
||||||
this(EncoderSelector.DEFAULT);
|
this(EncoderSelector.DEFAULT, /* disableFallback= */ false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates a new instance. */
|
/** Creates a new instance. */
|
||||||
public DefaultEncoderFactory(EncoderSelector videoEncoderSelector) {
|
public DefaultEncoderFactory(
|
||||||
|
@Nullable EncoderSelector videoEncoderSelector, boolean disableFallback) {
|
||||||
this.videoEncoderSelector = videoEncoderSelector;
|
this.videoEncoderSelector = videoEncoderSelector;
|
||||||
|
this.disableFallback = disableFallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -98,7 +107,8 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
Pair<MediaCodecInfo, Format> encoderAndClosestFormatSupport =
|
Pair<MediaCodecInfo, Format> encoderAndClosestFormatSupport =
|
||||||
findEncoderWithClosestFormatSupport(format, videoEncoderSelector, allowedMimeTypes);
|
findEncoderWithClosestFormatSupport(
|
||||||
|
format, videoEncoderSelector, allowedMimeTypes, disableFallback);
|
||||||
if (encoderAndClosestFormatSupport == null) {
|
if (encoderAndClosestFormatSupport == null) {
|
||||||
throw createTransformationException(
|
throw createTransformationException(
|
||||||
new IllegalArgumentException(
|
new IllegalArgumentException(
|
||||||
@ -145,16 +155,24 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
|
|||||||
@RequiresNonNull("#1.sampleMimeType")
|
@RequiresNonNull("#1.sampleMimeType")
|
||||||
@Nullable
|
@Nullable
|
||||||
private static Pair<MediaCodecInfo, Format> findEncoderWithClosestFormatSupport(
|
private static Pair<MediaCodecInfo, Format> findEncoderWithClosestFormatSupport(
|
||||||
Format requestedFormat, EncoderSelector encoderSelector, List<String> allowedMimeTypes) {
|
Format requestedFormat,
|
||||||
|
EncoderSelector encoderSelector,
|
||||||
|
List<String> allowedMimeTypes,
|
||||||
|
boolean disableFallback) {
|
||||||
|
String requestedMimeType = requestedFormat.sampleMimeType;
|
||||||
@Nullable
|
@Nullable
|
||||||
String mimeType =
|
String mimeType = findFallbackMimeType(encoderSelector, requestedMimeType, allowedMimeTypes);
|
||||||
findFallbackMimeType(encoderSelector, requestedFormat.sampleMimeType, allowedMimeTypes);
|
if (mimeType == null || (disableFallback && !requestedMimeType.equals(mimeType))) {
|
||||||
if (mimeType == null) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MediaCodecInfo> encodersForMimeType = encoderSelector.selectEncoderInfos(mimeType);
|
List<MediaCodecInfo> encodersForMimeType = encoderSelector.selectEncoderInfos(mimeType);
|
||||||
checkState(!encodersForMimeType.isEmpty());
|
if (encodersForMimeType.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (disableFallback) {
|
||||||
|
return Pair.create(encodersForMimeType.get(0), requestedFormat);
|
||||||
|
}
|
||||||
ImmutableList<MediaCodecInfo> filteredEncoders =
|
ImmutableList<MediaCodecInfo> filteredEncoders =
|
||||||
filterEncoders(
|
filterEncoders(
|
||||||
encodersForMimeType,
|
encodersForMimeType,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user