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 e822c6caed..494e40afcf 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 @@ -56,7 +56,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { public static final class Builder { private final Context context; - @Nullable private EncoderSelector encoderSelector; + @Nullable private EncoderSelector videoEncoderSelector; @Nullable private VideoEncoderSettings requestedVideoEncoderSettings; private boolean enableFallback; @@ -72,8 +72,8 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { *

The default value is {@link EncoderSelector#DEFAULT}. */ @CanIgnoreReturnValue - public Builder setVideoEncoderSelector(EncoderSelector encoderSelector) { - this.encoderSelector = encoderSelector; + public Builder setVideoEncoderSelector(EncoderSelector videoEncoderSelector) { + this.videoEncoderSelector = videoEncoderSelector; return this; } @@ -121,14 +121,14 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { /** Creates an instance of {@link DefaultEncoderFactory}, using defaults if values are unset. */ @SuppressWarnings("deprecation") public DefaultEncoderFactory build() { - if (encoderSelector == null) { - encoderSelector = EncoderSelector.DEFAULT; + if (videoEncoderSelector == null) { + videoEncoderSelector = EncoderSelector.DEFAULT; } if (requestedVideoEncoderSettings == null) { requestedVideoEncoderSettings = VideoEncoderSettings.DEFAULT; } return new DefaultEncoderFactory( - context, encoderSelector, requestedVideoEncoderSettings, enableFallback); + context, videoEncoderSelector, requestedVideoEncoderSettings, enableFallback); } } @@ -450,6 +450,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { /** Returns a list of encoders that support the requested resolution most closely. */ private static ImmutableList filterEncodersByResolution( List encoders, String mimeType, int requestedWidth, int requestedHeight) { + // TODO(b/267740292): Investigate the fallback logic that might prefer software encoders. return filterEncoders( encoders, /* cost= */ (encoderInfo) -> { diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderSelector.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderSelector.java index 0527652e07..df0c716fed 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderSelector.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderSelector.java @@ -20,15 +20,29 @@ import android.media.MediaCodec; import android.media.MediaCodecInfo; import com.google.android.exoplayer2.util.MimeTypes; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; /** Selector of {@link MediaCodec} encoder instances. */ public interface EncoderSelector { /** - * Default implementation of {@link EncoderSelector}, which returns the preferred encoders for the + * Default implementation of {@code EncoderSelector}, which returns the preferred encoders for the * given {@link MimeTypes MIME type}. + * + *

The {@code EncoderSelector} selection result contains only hardware encoders if they exist, + * or only software encoders otherwise. */ - EncoderSelector DEFAULT = EncoderUtil::getSupportedEncoders; + EncoderSelector DEFAULT = + mimeType -> { + ImmutableList supportedEncoders = + EncoderUtil.getSupportedEncoders(mimeType); + ImmutableList supportedHardwareEncoders = + ImmutableList.copyOf( + Iterables.filter( + supportedEncoders, + encoderInfo -> EncoderUtil.isHardwareAccelerated(encoderInfo, mimeType))); + return supportedHardwareEncoders.isEmpty() ? supportedEncoders : supportedHardwareEncoders; + }; /** * Returns a list of encoders that can encode media in the specified {@code mimeType}, in priority