Commit 5b8c4e09 by hschlueter Committed by Ian Baker

Add enable fallback option to transformer demo.

Also invert disableFallback parameter in DefaultEncoderFactory
to enableFallback. Fallback is still enabled by default.

PiperOrigin-RevId: 429253266
parent 34007364
...@@ -54,6 +54,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -54,6 +54,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
public static final String SCALE_X = "scale_x"; public static final String SCALE_X = "scale_x";
public static final String SCALE_Y = "scale_y"; public static final String SCALE_Y = "scale_y";
public static final String ROTATE_DEGREES = "rotate_degrees"; public static final String ROTATE_DEGREES = "rotate_degrees";
public static final String ENABLE_FALLBACK = "enable_fallback";
public static final String ENABLE_HDR_EDITING = "enable_hdr_editing"; public static final String ENABLE_HDR_EDITING = "enable_hdr_editing";
private static final String[] INPUT_URIS = { private static final String[] INPUT_URIS = {
"https://html5demos.com/assets/dizzy.mp4", "https://html5demos.com/assets/dizzy.mp4",
...@@ -80,6 +81,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -80,6 +81,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
private @MonotonicNonNull Spinner translateSpinner; private @MonotonicNonNull Spinner translateSpinner;
private @MonotonicNonNull Spinner scaleSpinner; private @MonotonicNonNull Spinner scaleSpinner;
private @MonotonicNonNull Spinner rotateSpinner; private @MonotonicNonNull Spinner rotateSpinner;
private @MonotonicNonNull CheckBox enableFallbackCheckBox;
private @MonotonicNonNull CheckBox enableHdrEditingCheckBox; private @MonotonicNonNull CheckBox enableHdrEditingCheckBox;
private int inputUriPosition; private int inputUriPosition;
...@@ -154,6 +156,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -154,6 +156,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
rotateSpinner.setAdapter(rotateAdapter); rotateSpinner.setAdapter(rotateAdapter);
rotateAdapter.addAll(SAME_AS_INPUT_OPTION, "0", "10", "45", "60", "90", "180"); rotateAdapter.addAll(SAME_AS_INPUT_OPTION, "0", "10", "45", "60", "90", "180");
enableFallbackCheckBox = findViewById(R.id.enable_fallback_checkbox);
enableHdrEditingCheckBox = findViewById(R.id.hdr_editing_checkbox); enableHdrEditingCheckBox = findViewById(R.id.hdr_editing_checkbox);
} }
...@@ -183,6 +186,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -183,6 +186,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
"translateSpinner", "translateSpinner",
"scaleSpinner", "scaleSpinner",
"rotateSpinner", "rotateSpinner",
"enableFallbackCheckBox",
"enableHdrEditingCheckBox" "enableHdrEditingCheckBox"
}) })
private void startTransformation(View view) { private void startTransformation(View view) {
...@@ -221,6 +225,7 @@ public final class ConfigurationActivity extends AppCompatActivity { ...@@ -221,6 +225,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
if (!SAME_AS_INPUT_OPTION.equals(selectedRotate)) { if (!SAME_AS_INPUT_OPTION.equals(selectedRotate)) {
bundle.putFloat(ROTATE_DEGREES, Float.parseFloat(selectedRotate)); bundle.putFloat(ROTATE_DEGREES, Float.parseFloat(selectedRotate));
} }
bundle.putBoolean(ENABLE_FALLBACK, enableFallbackCheckBox.isChecked());
bundle.putBoolean(ENABLE_HDR_EDITING, enableHdrEditingCheckBox.isChecked()); bundle.putBoolean(ENABLE_HDR_EDITING, enableHdrEditingCheckBox.isChecked());
transformerIntent.putExtras(bundle); transformerIntent.putExtras(bundle);
......
...@@ -36,6 +36,8 @@ import androidx.appcompat.app.AppCompatActivity; ...@@ -36,6 +36,8 @@ import androidx.appcompat.app.AppCompatActivity;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.transformer.DefaultEncoderFactory;
import com.google.android.exoplayer2.transformer.EncoderSelector;
import com.google.android.exoplayer2.transformer.ProgressHolder; import com.google.android.exoplayer2.transformer.ProgressHolder;
import com.google.android.exoplayer2.transformer.TransformationException; import com.google.android.exoplayer2.transformer.TransformationException;
import com.google.android.exoplayer2.transformer.TransformationRequest; import com.google.android.exoplayer2.transformer.TransformationRequest;
...@@ -224,7 +226,11 @@ public final class TransformerActivity extends AppCompatActivity { ...@@ -224,7 +226,11 @@ public final class TransformerActivity extends AppCompatActivity {
transformerBuilder transformerBuilder
.setTransformationRequest(requestBuilder.build()) .setTransformationRequest(requestBuilder.build())
.setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO)) .setRemoveAudio(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_AUDIO))
.setRemoveVideo(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_VIDEO)); .setRemoveVideo(bundle.getBoolean(ConfigurationActivity.SHOULD_REMOVE_VIDEO))
.setEncoderFactory(
new DefaultEncoderFactory(
EncoderSelector.DEFAULT,
/* enableFallback= */ bundle.getBoolean(ConfigurationActivity.ENABLE_FALLBACK)));
} }
return transformerBuilder return transformerBuilder
.addListener( .addListener(
......
...@@ -174,6 +174,16 @@ ...@@ -174,6 +174,16 @@
android:layout_weight="1" android:layout_weight="1"
android:gravity="center_vertical" > android:gravity="center_vertical" >
<TextView <TextView
android:text="@string/enable_fallback" />
<CheckBox
android:id="@+id/enable_fallback_checkbox"
android:layout_gravity="right"
android:checked="true"/>
</TableRow>
<TableRow
android:layout_weight="1"
android:gravity="center_vertical" >
<TextView
android:id="@+id/hdr_editing" android:id="@+id/hdr_editing"
android:text="@string/hdr_editing" /> android:text="@string/hdr_editing" />
<CheckBox <CheckBox
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
<string name="translate" translatable="false">Translate video</string> <string name="translate" translatable="false">Translate video</string>
<string name="scale" translatable="false">Scale video</string> <string name="scale" translatable="false">Scale video</string>
<string name="rotate" translatable="false">Rotate video (degrees)</string> <string name="rotate" translatable="false">Rotate video (degrees)</string>
<string name="enable_fallback" translatable="false">Enable fallback</string>
<string name="transform" translatable="false">Transform</string> <string name="transform" translatable="false">Transform</string>
<string name="hdr_editing" translatable="false">[Experimental] HDR editing</string> <string name="hdr_editing" translatable="false">[Experimental] HDR editing</string>
<string name="debug_preview" translatable="false">Debug preview:</string> <string name="debug_preview" translatable="false">Debug preview:</string>
......
...@@ -48,7 +48,7 @@ public class TransformerEndToEndTest { ...@@ -48,7 +48,7 @@ public class TransformerEndToEndTest {
new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H264).build()) new TransformationRequest.Builder().setVideoMimeType(MimeTypes.VIDEO_H264).build())
.setMuxerFactory(muxerFactory) .setMuxerFactory(muxerFactory)
.setEncoderFactory( .setEncoderFactory(
new DefaultEncoderFactory(EncoderSelector.DEFAULT, /* disableFallback= */ true)) new DefaultEncoderFactory(EncoderSelector.DEFAULT, /* enableFallback= */ false))
.build(); .build();
// Result of the following command: // Result of the following command:
// ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames bear-vp9.webm // ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames bear-vp9.webm
...@@ -81,7 +81,7 @@ public class TransformerEndToEndTest { ...@@ -81,7 +81,7 @@ public class TransformerEndToEndTest {
.build()) .build())
.setMuxerFactory(muxerFactory) .setMuxerFactory(muxerFactory)
.setEncoderFactory( .setEncoderFactory(
new DefaultEncoderFactory(EncoderSelector.DEFAULT, /* disableFallback= */ true)) new DefaultEncoderFactory(EncoderSelector.DEFAULT, /* enableFallback= */ false))
.build(); .build();
// Result of the following command: // Result of the following command:
// ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4 // ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4
......
...@@ -44,7 +44,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { ...@@ -44,7 +44,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
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; private final boolean enableFallback;
/** /**
* Creates a new instance using the {@link EncoderSelector#DEFAULT default encoder selector}, and * Creates a new instance using the {@link EncoderSelector#DEFAULT default encoder selector}, and
...@@ -56,14 +56,14 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { ...@@ -56,14 +56,14 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
* type}, resolution, {@link Format#bitrate bitrate}, {@link Format#codecs profile/level}, etc. * type}, resolution, {@link Format#bitrate bitrate}, {@link Format#codecs profile/level}, etc.
*/ */
public DefaultEncoderFactory() { public DefaultEncoderFactory() {
this(EncoderSelector.DEFAULT, /* disableFallback= */ false); this(EncoderSelector.DEFAULT, /* enableFallback= */ true);
} }
/** Creates a new instance. */ /** Creates a new instance. */
public DefaultEncoderFactory( public DefaultEncoderFactory(
@Nullable EncoderSelector videoEncoderSelector, boolean disableFallback) { @Nullable EncoderSelector videoEncoderSelector, boolean enableFallback) {
this.videoEncoderSelector = videoEncoderSelector; this.videoEncoderSelector = videoEncoderSelector;
this.disableFallback = disableFallback; this.enableFallback = enableFallback;
} }
@Override @Override
...@@ -72,7 +72,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { ...@@ -72,7 +72,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
// TODO(b/210591626) Add encoder selection for audio. // TODO(b/210591626) Add encoder selection for audio.
checkArgument(!allowedMimeTypes.isEmpty()); checkArgument(!allowedMimeTypes.isEmpty());
if (!allowedMimeTypes.contains(format.sampleMimeType)) { if (!allowedMimeTypes.contains(format.sampleMimeType)) {
if (!disableFallback) { if (enableFallback) {
// TODO(b/210591626): Pick fallback MIME type using same strategy as for encoder // TODO(b/210591626): Pick fallback MIME type using same strategy as for encoder
// capabilities limitations. // capabilities limitations.
format = format.buildUpon().setSampleMimeType(allowedMimeTypes.get(0)).build(); format = format.buildUpon().setSampleMimeType(allowedMimeTypes.get(0)).build();
...@@ -115,7 +115,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { ...@@ -115,7 +115,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
@Nullable @Nullable
Pair<MediaCodecInfo, Format> encoderAndClosestFormatSupport = Pair<MediaCodecInfo, Format> encoderAndClosestFormatSupport =
findEncoderWithClosestFormatSupport( findEncoderWithClosestFormatSupport(
format, videoEncoderSelector, allowedMimeTypes, disableFallback); format, videoEncoderSelector, allowedMimeTypes, enableFallback);
if (encoderAndClosestFormatSupport == null) { if (encoderAndClosestFormatSupport == null) {
throw TransformationException.createForCodec( throw TransformationException.createForCodec(
new IllegalArgumentException("The requested output format is not supported."), new IllegalArgumentException("The requested output format is not supported."),
...@@ -211,11 +211,11 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { ...@@ -211,11 +211,11 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
Format requestedFormat, Format requestedFormat,
EncoderSelector encoderSelector, EncoderSelector encoderSelector,
List<String> allowedMimeTypes, List<String> allowedMimeTypes,
boolean disableFallback) { boolean enableFallback) {
String requestedMimeType = requestedFormat.sampleMimeType; String requestedMimeType = requestedFormat.sampleMimeType;
@Nullable @Nullable
String mimeType = findFallbackMimeType(encoderSelector, requestedMimeType, allowedMimeTypes); String mimeType = findFallbackMimeType(encoderSelector, requestedMimeType, allowedMimeTypes);
if (mimeType == null || (disableFallback && !requestedMimeType.equals(mimeType))) { if (mimeType == null || (!enableFallback && !requestedMimeType.equals(mimeType))) {
return null; return null;
} }
...@@ -223,7 +223,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { ...@@ -223,7 +223,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
if (encodersForMimeType.isEmpty()) { if (encodersForMimeType.isEmpty()) {
return null; return null;
} }
if (disableFallback) { if (!enableFallback) {
return Pair.create(encodersForMimeType.get(0), requestedFormat); return Pair.create(encodersForMimeType.get(0), requestedFormat);
} }
ImmutableList<MediaCodecInfo> filteredEncoders = ImmutableList<MediaCodecInfo> filteredEncoders =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment