Update demo app with image input

Adds a new option to the preset file list to show an image for 5secs at 30fps. Also adds an ImageView to show the input image

PiperOrigin-RevId: 510372035
This commit is contained in:
tofunmi 2023-02-17 09:57:09 +00:00 committed by christosts
parent fc642eb45f
commit d20c11442a
4 changed files with 63 additions and 10 deletions

View File

@ -132,6 +132,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
"https://storage.googleapis.com/exoplayer-test-media-0/BigBuckBunny_320x180.mp4",
"https://storage.googleapis.com/exoplayer-test-media-1/mp4/portrait_avc_aac.mp4",
"https://storage.googleapis.com/exoplayer-test-media-1/mp4/portrait_rotated_avc_aac.mp4",
"https://storage.googleapis.com/exoplayer-test-media-1/jpg/london.jpg",
"https://storage.googleapis.com/exoplayer-test-media-1/mp4/slow-motion/slowMotion_stopwatch_240fps_long.mp4",
"https://storage.googleapis.com/exoplayer-test-media-1/gen/screens/dash-vod-single-segment/manifest-baseline.mpd",
"https://storage.googleapis.com/exoplayer-test-media-1/mp4/samsung-s21-hdr-hdr10.mp4",
@ -149,6 +150,7 @@ public final class ConfigurationActivity extends AppCompatActivity {
"Long 180p H264 video and AAC audio",
"H264 video and AAC audio (portrait, H > W, 0\u00B0)",
"H264 video and AAC audio (portrait, H < W, 90\u00B0)",
"JPG image (Plays for 5secs at 30fps)",
"SEF slow motion with 240 fps",
"480p DASH (non-square pixels)",
"HDR (HDR10) H265 limited range video (encoding may fail)",

View File

@ -27,6 +27,7 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@ -41,6 +42,7 @@ import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
@ -53,6 +55,7 @@ import androidx.media3.common.Effect;
import androidx.media3.common.MediaItem;
import androidx.media3.common.audio.AudioProcessor;
import androidx.media3.common.audio.SonicAudioProcessor;
import androidx.media3.common.util.BitmapLoader;
import androidx.media3.common.util.GlUtil;
import androidx.media3.common.util.Log;
import androidx.media3.effect.BitmapOverlay;
@ -68,6 +71,7 @@ import androidx.media3.effect.RgbAdjustment;
import androidx.media3.effect.RgbFilter;
import androidx.media3.effect.RgbMatrix;
import androidx.media3.effect.ScaleToFitTransformation;
import androidx.media3.effect.SimpleBitmapLoader;
import androidx.media3.effect.SingleColorLut;
import androidx.media3.effect.TextOverlay;
import androidx.media3.effect.TextureOverlay;
@ -91,10 +95,12 @@ import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.common.base.Stopwatch;
import com.google.common.base.Ticker;
import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.ListenableFuture;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@ -105,6 +111,8 @@ public final class TransformerActivity extends AppCompatActivity {
private @MonotonicNonNull Button displayInputButton;
private @MonotonicNonNull MaterialCardView inputCardView;
private @MonotonicNonNull TextView inputTextView;
private @MonotonicNonNull ImageView inputImageView;
private @MonotonicNonNull PlayerView inputPlayerView;
private @MonotonicNonNull PlayerView outputPlayerView;
private @MonotonicNonNull TextView debugTextView;
@ -126,6 +134,8 @@ public final class TransformerActivity extends AppCompatActivity {
setContentView(R.layout.transformer_activity);
inputCardView = findViewById(R.id.input_card_view);
inputTextView = findViewById(R.id.input_text_view);
inputImageView = findViewById(R.id.input_image_view);
inputPlayerView = findViewById(R.id.input_player_view);
outputPlayerView = findViewById(R.id.output_player_view);
debugTextView = findViewById(R.id.debug_text_view);
@ -154,6 +164,8 @@ public final class TransformerActivity extends AppCompatActivity {
checkNotNull(informationTextView);
checkNotNull(transformationStopwatch);
checkNotNull(inputCardView);
checkNotNull(inputTextView);
checkNotNull(inputImageView);
checkNotNull(inputPlayerView);
checkNotNull(outputPlayerView);
checkNotNull(debugTextView);
@ -187,6 +199,8 @@ public final class TransformerActivity extends AppCompatActivity {
@RequiresNonNull({
"inputCardView",
"inputTextView",
"inputImageView",
"inputPlayerView",
"outputPlayerView",
"displayInputButton",
@ -262,6 +276,8 @@ public final class TransformerActivity extends AppCompatActivity {
@RequiresNonNull({
"inputCardView",
"inputTextView",
"inputImageView",
"inputPlayerView",
"outputPlayerView",
"displayInputButton",
@ -349,6 +365,8 @@ public final class TransformerActivity extends AppCompatActivity {
if (bundle == null) {
return editedMediaItemBuilder.build();
}
// For image inputs. Automatically ignored if input is audio/video.
editedMediaItemBuilder.setDurationUs(5_000_000).setFrameRate(30);
ImmutableList<AudioProcessor> audioProcessors = createAudioProcessorsFromBundle(bundle);
ImmutableList<Effect> videoEffects = createVideoEffectsFromBundle(bundle);
return editedMediaItemBuilder
@ -616,6 +634,8 @@ public final class TransformerActivity extends AppCompatActivity {
@RequiresNonNull({
"inputCardView",
"inputTextView",
"inputImageView",
"inputPlayerView",
"outputPlayerView",
"displayInputButton",
@ -641,6 +661,8 @@ public final class TransformerActivity extends AppCompatActivity {
@RequiresNonNull({
"inputCardView",
"inputTextView",
"inputImageView",
"inputPlayerView",
"outputPlayerView",
"debugTextView",
@ -649,14 +671,7 @@ public final class TransformerActivity extends AppCompatActivity {
inputPlayerView.setPlayer(null);
outputPlayerView.setPlayer(null);
releasePlayer();
ExoPlayer inputPlayer = new ExoPlayer.Builder(/* context= */ this).build();
inputPlayerView.setPlayer(inputPlayer);
inputPlayerView.setControllerAutoShow(false);
inputPlayer.setMediaItem(inputMediaItem);
inputPlayer.prepare();
this.inputPlayer = inputPlayer;
inputPlayer.setVolume(0f);
Uri uri = checkNotNull(inputMediaItem.localConfiguration).uri;
ExoPlayer outputPlayer = new ExoPlayer.Builder(/* context= */ this).build();
outputPlayerView.setPlayer(outputPlayer);
@ -665,7 +680,34 @@ public final class TransformerActivity extends AppCompatActivity {
outputPlayer.prepare();
this.outputPlayer = outputPlayer;
inputPlayer.play();
// Only support showing jpg images.
if (uri.toString().endsWith("jpg")) {
inputPlayerView.setVisibility(View.GONE);
inputImageView.setVisibility(View.VISIBLE);
inputTextView.setText(getString(R.string.input_image));
BitmapLoader bitmapLoader = new SimpleBitmapLoader();
ListenableFuture<Bitmap> future = bitmapLoader.loadBitmap(uri);
try {
Bitmap bitmap = future.get();
inputImageView.setImageBitmap(bitmap);
} catch (ExecutionException | InterruptedException e) {
throw new IllegalArgumentException("Failed to load bitmap.", e);
}
} else {
inputPlayerView.setVisibility(View.VISIBLE);
inputImageView.setVisibility(View.GONE);
inputTextView.setText(getString(R.string.input_video));
ExoPlayer inputPlayer = new ExoPlayer.Builder(/* context= */ this).build();
inputPlayerView.setPlayer(inputPlayer);
inputPlayerView.setControllerAutoShow(false);
inputPlayer.setMediaItem(inputMediaItem);
inputPlayer.prepare();
this.inputPlayer = inputPlayer;
inputPlayer.setVolume(0f);
inputPlayer.play();
}
outputPlayer.play();
debugTextViewHelper = new DebugTextViewHelper(outputPlayer, debugTextView);
@ -708,7 +750,9 @@ public final class TransformerActivity extends AppCompatActivity {
inputCardView.setVisibility(View.VISIBLE);
displayInputButton.setText(getString(R.string.hide_input_video));
} else if (inputCardView.getVisibility() == View.VISIBLE) {
checkNotNull(inputPlayer).pause();
if (inputPlayer != null) {
inputPlayer.pause();
}
inputCardView.setVisibility(View.GONE);
displayInputButton.setText(getString(R.string.show_input_video));
}

View File

@ -69,6 +69,7 @@
android:layout_height="wrap_content" >
<TextView
android:id="@+id/input_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
@ -79,6 +80,11 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/input_image_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.media3.ui.PlayerView
android:id="@+id/input_player_view"
android:layout_width="match_parent"

View File

@ -61,6 +61,7 @@
<string name="hue_adjustment">Hue adjustment</string>
<string name="saturation_adjustment">Saturation adjustment</string>
<string name="lightness_adjustment">Lightness adjustment</string>
<string name="input_image">Input image:</string>
<string name="input_video">Input video:</string>
<string name="output_video">Output video:</string>
<string name="permission_denied">Permission Denied</string>