Use AndroidTestUtil constants so test asset information is consistent.

PiperOrigin-RevId: 643984158
This commit is contained in:
samrobinson 2024-06-17 06:20:34 -07:00 committed by Copybara-Service
parent ded1adc092
commit 6dcbafad21
5 changed files with 66 additions and 55 deletions

View file

@ -75,6 +75,7 @@ public final class AndroidTestUtil {
"asset:///media/png/loremipsum_1920x720.png";
public static final String JPG_ASSET_URI_STRING = "asset:///media/jpeg/london.jpg";
public static final String JPG_PORTRAIT_ASSET_URI_STRING = "asset:///media/jpeg/tokyo.jpg";
public static final String JPG_SINGLE_PIXEL_URI_STRING = "asset:///media/jpeg/white-1x1.jpg";
public static final String ULTRA_HDR_URI_STRING = "asset:///media/jpeg/ultraHDR.jpg";
public static final String MP4_TRIM_OPTIMIZATION_URI_STRING =
@ -98,6 +99,7 @@ public final class AndroidTestUtil {
.setFrameRate(29.97f)
.setCodecs("avc1.64001F")
.build();
public static final long MP4_ASSET_DURATION_US = 1_024_000L;
// Result of the following command for MP4_ASSET_URI_STRING
// ffprobe -count_frames -select_streams v:0 -show_entries stream=nb_read_frames sample.mp4

View file

@ -16,6 +16,8 @@
package androidx.media3.transformer;
import static androidx.media3.common.PlaybackException.ERROR_CODE_DECODER_INIT_FAILED;
import static androidx.media3.transformer.AndroidTestUtil.JPG_SINGLE_PIXEL_URI_STRING;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.util.concurrent.Futures.immediateFuture;
import static org.junit.Assert.assertThrows;
@ -70,8 +72,6 @@ import org.junit.runner.RunWith;
public class CompositionPlayerTest {
private static final long TEST_TIMEOUT_MS = 10_000;
private static final String MP4_ASSET = "asset:///media/mp4/sample.mp4";
private static final String IMAGE_ASSET = "asset:///media/jpeg/white-1x1.jpg";
@Rule
public ActivityScenarioRule<SurfaceTestActivity> rule =
@ -122,7 +122,7 @@ public class CompositionPlayerTest {
compositionPlayer.setComposition(
new Composition.Builder(
new EditedMediaItemSequence(
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build()))
.build());
@ -142,7 +142,7 @@ public class CompositionPlayerTest {
compositionPlayer.setComposition(
new Composition.Builder(
new EditedMediaItemSequence(
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build()))
.build());
@ -166,7 +166,7 @@ public class CompositionPlayerTest {
compositionPlayer.setComposition(
new Composition.Builder(
new EditedMediaItemSequence(
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build()))
.build());
@ -188,7 +188,7 @@ public class CompositionPlayerTest {
compositionPlayer.setComposition(
new Composition.Builder(
new EditedMediaItemSequence(
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build()))
.build());
@ -232,7 +232,7 @@ public class CompositionPlayerTest {
new EditedMediaItemSequence(
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(1_000)
.build())
.setDurationUs(1_000_000)
@ -273,7 +273,7 @@ public class CompositionPlayerTest {
new EditedMediaItemSequence(
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE)
.setImageDurationMs(1_000)
.build())
@ -291,7 +291,10 @@ public class CompositionPlayerTest {
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
EditedMediaItem image =
new EditedMediaItem.Builder(
new MediaItem.Builder().setUri(IMAGE_ASSET).setImageDurationMs(500).build())
new MediaItem.Builder()
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(500)
.build())
.setDurationUs(500_000)
.build();
@ -316,12 +319,17 @@ public class CompositionPlayerTest {
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
EditedMediaItem image =
new EditedMediaItem.Builder(
new MediaItem.Builder().setUri(IMAGE_ASSET).setImageDurationMs(500).build())
new MediaItem.Builder()
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(500)
.build())
.setDurationUs(500_000)
.build();
EditedMediaItem video =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET)).setDurationUs(1_000_000).build();
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build();
instrumentation.runOnMainSync(
() -> {
@ -343,10 +351,15 @@ public class CompositionPlayerTest {
public void composition_videoThenImage() throws Exception {
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
EditedMediaItem video =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET)).setDurationUs(1_000_000).build();
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build();
EditedMediaItem image =
new EditedMediaItem.Builder(
new MediaItem.Builder().setUri(IMAGE_ASSET).setImageDurationMs(500).build())
new MediaItem.Builder()
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(500)
.build())
.setDurationUs(500_000)
.build();
@ -370,7 +383,9 @@ public class CompositionPlayerTest {
public void playback_videoSinkProviderFails_playerRaisesError() {
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
EditedMediaItem video =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET)).setDurationUs(1_000_000).build();
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build();
instrumentation.runOnMainSync(
() -> {
@ -405,7 +420,9 @@ public class CompositionPlayerTest {
throws Exception {
PlayerTestListener playerTestListener = new PlayerTestListener(TEST_TIMEOUT_MS);
EditedMediaItem video =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET)).setDurationUs(1_000_000).build();
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(1_000_000)
.build();
instrumentation.runOnMainSync(
() -> {
compositionPlayer =

View file

@ -17,6 +17,9 @@
package androidx.media3.transformer;
import static androidx.media3.common.util.Util.usToMs;
import static androidx.media3.transformer.AndroidTestUtil.JPG_SINGLE_PIXEL_URI_STRING;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DURATION_US;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
import static com.google.common.truth.Truth.assertThat;
import android.app.Instrumentation;
@ -46,15 +49,12 @@ import org.junit.runner.RunWith;
public class VideoTimestampConsistencyTest {
private static final long TEST_TIMEOUT_MS = 10_000;
private static final String MP4_ASSET = "asset:///media/mp4/sample.mp4";
private static final long MP4_ASSET_DURATION_US = 1_024_000L;
private static final ImmutableList<Long> MP4_ASSET_FRAME_TIMESTAMPS_US =
ImmutableList.of(
0L, 33366L, 66733L, 100100L, 133466L, 166833L, 200200L, 233566L, 266933L, 300300L,
333666L, 367033L, 400400L, 433766L, 467133L, 500500L, 533866L, 567233L, 600600L, 633966L,
667333L, 700700L, 734066L, 767433L, 800800L, 834166L, 867533L, 900900L, 934266L, 967633L);
private static final String IMAGE_ASSET = "asset:///media/jpeg/white-1x1.jpg";
private static final ImmutableList<Long> IMAGE_TIMESTAMPS_US_500_MS_30_FPS =
ImmutableList.of(
0L, 33333L, 66667L, 100000L, 133333L, 166667L, 200000L, 233333L, 266667L, 300000L,
@ -89,7 +89,7 @@ public class VideoTimestampConsistencyTest {
EditedMediaItem image =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(usToMs(imageDurationUs))
.build())
.setDurationUs(imageDurationUs)
@ -102,7 +102,7 @@ public class VideoTimestampConsistencyTest {
@Test
public void oneVideoComposition_timestampsAreConsistent() throws Exception {
EditedMediaItem video =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(MP4_ASSET_DURATION_US)
.build();
@ -115,7 +115,7 @@ public class VideoTimestampConsistencyTest {
long clippedStartUs = 500_000L;
EditedMediaItem video1 =
new EditedMediaItem.Builder(
MediaItem.fromUri(MP4_ASSET)
MediaItem.fromUri(MP4_ASSET_URI_STRING)
.buildUpon()
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder()
@ -126,7 +126,7 @@ public class VideoTimestampConsistencyTest {
.build();
EditedMediaItem video2 =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(MP4_ASSET_DURATION_US)
.build();
@ -145,12 +145,12 @@ public class VideoTimestampConsistencyTest {
@Test
public void twoVideosComposition_timestampsAreConsistent() throws Exception {
EditedMediaItem video1 =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(MP4_ASSET_DURATION_US)
.build();
EditedMediaItem video2 =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(MP4_ASSET_DURATION_US)
.build();
@ -173,7 +173,7 @@ public class VideoTimestampConsistencyTest {
EditedMediaItem image1 =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(usToMs(imageDurationUs))
.build())
.setDurationUs(imageDurationUs)
@ -182,7 +182,7 @@ public class VideoTimestampConsistencyTest {
EditedMediaItem image2 =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(usToMs(imageDurationUs))
.build())
.setDurationUs(imageDurationUs)
@ -209,14 +209,14 @@ public class VideoTimestampConsistencyTest {
EditedMediaItem image =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(usToMs(imageDurationUs))
.build())
.setDurationUs(imageDurationUs)
.setFrameRate(30)
.build();
EditedMediaItem video =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(MP4_ASSET_DURATION_US)
.build();
@ -236,13 +236,13 @@ public class VideoTimestampConsistencyTest {
long imageDurationUs = 500_000L;
EditedMediaItem video =
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(MP4_ASSET_DURATION_US)
.build();
EditedMediaItem image =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(usToMs(imageDurationUs))
.build())
.setDurationUs(imageDurationUs)
@ -268,7 +268,7 @@ public class VideoTimestampConsistencyTest {
EditedMediaItem video =
new EditedMediaItem.Builder(
MediaItem.fromUri(MP4_ASSET)
MediaItem.fromUri(MP4_ASSET_URI_STRING)
.buildUpon()
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder()
@ -280,7 +280,7 @@ public class VideoTimestampConsistencyTest {
EditedMediaItem image =
new EditedMediaItem.Builder(
new MediaItem.Builder()
.setUri(IMAGE_ASSET)
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
.setImageDurationMs(usToMs(imageDurationUs))
.build())
.setDurationUs(imageDurationUs)

View file

@ -16,11 +16,12 @@
package androidx.media3.transformer.mh.performance;
import static androidx.media3.common.MimeTypes.VIDEO_H264;
import static androidx.media3.test.utils.BitmapPixelTestUtil.MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE;
import static androidx.media3.test.utils.BitmapPixelTestUtil.createArgb8888BitmapFromRgba8888Image;
import static androidx.media3.test.utils.BitmapPixelTestUtil.getBitmapAveragePixelAbsoluteDifferenceArgb8888;
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
import static androidx.media3.transformer.mh.performance.PlaybackTestUtil.createTimestampOverlay;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
@ -30,7 +31,6 @@ import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.media.Image;
import android.media.ImageReader;
import androidx.media3.common.Format;
import androidx.media3.common.MediaItem;
import androidx.media3.common.util.ConditionVariable;
import androidx.media3.common.util.Size;
@ -58,17 +58,6 @@ import org.junit.runner.RunWith;
public class CompositionPlaybackTest {
private static final String TEST_DIRECTORY = "test-generated-goldens/ExoPlayerPlaybackTest";
private static final String MP4_ASSET_URI_STRING = "asset:///media/mp4/sample.mp4";
private static final Format MP4_ASSET_FORMAT =
new Format.Builder()
.setSampleMimeType(VIDEO_H264)
.setWidth(1080)
.setHeight(720)
.setFrameRate(29.97f)
.setCodecs("avc1.64001F")
.build();
private static final Size MP4_ASSET_VIDEO_SIZE =
new Size(MP4_ASSET_FORMAT.width, MP4_ASSET_FORMAT.height);
private static final long TEST_TIMEOUT_MS = 10_000;
@Rule public final TestName testName = new TestName();
@ -102,8 +91,8 @@ public class CompositionPlaybackTest {
ConditionVariable hasRenderedFirstFrameCondition = new ConditionVariable();
outputImageReader =
ImageReader.newInstance(
MP4_ASSET_VIDEO_SIZE.getWidth(),
MP4_ASSET_VIDEO_SIZE.getHeight(),
MP4_ASSET_FORMAT.width,
MP4_ASSET_FORMAT.height,
PixelFormat.RGBA_8888,
/* maxImages= */ 1);
@ -119,7 +108,9 @@ public class CompositionPlaybackTest {
},
Util.createHandlerForCurrentOrMainLooper());
player.setVideoSurface(outputImageReader.getSurface(), MP4_ASSET_VIDEO_SIZE);
player.setVideoSurface(
outputImageReader.getSurface(),
new Size(MP4_ASSET_FORMAT.width, MP4_ASSET_FORMAT.height));
player.setComposition(
new Composition.Builder(
new EditedMediaItemSequence(

View file

@ -17,6 +17,8 @@
package androidx.media3.transformer.mh.performance;
import static androidx.media3.common.util.Util.usToMs;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DURATION_US;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
import static com.google.common.collect.Iterables.getLast;
import static com.google.common.truth.Truth.assertThat;
@ -28,6 +30,7 @@ import androidx.media3.common.GlObjectsProvider;
import androidx.media3.common.GlTextureInfo;
import androidx.media3.common.MediaItem;
import androidx.media3.effect.GlEffect;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.Composition;
import androidx.media3.transformer.CompositionPlayer;
import androidx.media3.transformer.EditedMediaItem;
@ -58,8 +61,6 @@ import org.junit.runner.RunWith;
public class CompositionPlayerSeekTest {
private static final long TEST_TIMEOUT_MS = 10_000;
private static final String MP4_ASSET = "asset:///media/mp4/sample.mp4";
private static final long MP4_ASSET_DURATION_US = 1_024_000L;
private static final ImmutableList<Long> MP4_ASSET_TIMESTAMPS_US =
ImmutableList.of(
0L, 33366L, 66733L, 100100L, 133466L, 166833L, 200200L, 233566L, 266933L, 300300L,
@ -278,9 +279,9 @@ public class CompositionPlayerSeekTest {
}
/**
* Plays the {@link #MP4_ASSET} for {@code videoLoopCount} times, seeks after {@code
* numberOfFramesBeforeSeeking} frames to {@code seekTimeMs}, and returns the timestamps of the
* processed frames, in microsecond.
* Plays the {@link AndroidTestUtil#MP4_ASSET_URI_STRING} for {@code videoLoopCount} times, seeks
* after {@code numberOfFramesBeforeSeeking} frames to {@code seekTimeMs}, and returns the
* timestamps of the processed frames, in microsecond.
*/
private ImmutableList<Long> playCompositionOfTwoVideosAndGetTimestamps(
PlayerTestListener listener, int numberOfFramesBeforeSeeking, long seekTimeMs)
@ -352,8 +353,8 @@ public class CompositionPlayerSeekTest {
}
private static EditedMediaItem createEditedMediaItem(List<Effect> videoEffects) {
return new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET))
.setDurationUs(1_024_000)
return new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
.setDurationUs(MP4_ASSET_DURATION_US)
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
.build();
}