Assert file size in E2E android tests that claim to complete.

Remove redundant test logic to add file size to ExportResult because
the file size is already added to export result as part of an export
finishing.

PiperOrigin-RevId: 636499236
This commit is contained in:
samrobinson 2024-05-23 04:14:41 -07:00 committed by Copybara-Service
parent 08006651fa
commit 414dbebc2b
14 changed files with 202 additions and 143 deletions

View File

@ -375,6 +375,7 @@ public class TestUtil {
public static Format retrieveTrackFormat( public static Format retrieveTrackFormat(
Context context, String fileUri, @C.TrackType int trackType) Context context, String fileUri, @C.TrackType int trackType)
throws ExecutionException, InterruptedException { throws ExecutionException, InterruptedException {
checkState(new File(fileUri).length() > 0);
TrackGroupArray trackGroupArray; TrackGroupArray trackGroupArray;
trackGroupArray = MetadataRetriever.retrieveMetadata(context, MediaItem.fromUri(fileUri)).get(); trackGroupArray = MetadataRetriever.retrieveMetadata(context, MediaItem.fromUri(fileUri)).get();
for (int i = 0; i < trackGroupArray.length; i++) { for (int i = 0; i < trackGroupArray.length; i++) {

View File

@ -34,6 +34,7 @@ import androidx.media3.common.util.Util;
import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.decoder.DecoderInputBuffer;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.json.JSONException; import org.json.JSONException;
@ -81,6 +82,7 @@ public class ForceEndOfStreamTest {
assertThat(testResult.analysisException).isNull(); assertThat(testResult.analysisException).isNull();
assertThat(testResult.exportResult.videoFrameCount) assertThat(testResult.exportResult.videoFrameCount)
.isEqualTo(MP4_ASSET_FRAME_COUNT - framesToSkip); .isEqualTo(MP4_ASSET_FRAME_COUNT - framesToSkip);
assertThat(new File(testResult.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -100,6 +102,7 @@ public class ForceEndOfStreamTest {
assertThat(testResult.analysisException).isNull(); assertThat(testResult.analysisException).isNull();
assertThat(testResult.exportResult.videoFrameCount).isEqualTo(MP4_ASSET_FRAME_COUNT); assertThat(testResult.exportResult.videoFrameCount).isEqualTo(MP4_ASSET_FRAME_COUNT);
assertThat(new File(testResult.filePath).length()).isGreaterThan(0);
} }
private static boolean skipTestBelowApi29(Context context, String testId) private static boolean skipTestBelowApi29(Context context, String testId)

View File

@ -432,11 +432,7 @@ public class TransformerAndroidTestRunner {
// No exceptions raised, export has succeeded. // No exceptions raised, export has succeeded.
ExportTestResult.Builder testResultBuilder = ExportTestResult.Builder testResultBuilder =
new ExportTestResult.Builder( new ExportTestResult.Builder(checkNotNull(exportResultReference.get()))
checkNotNull(exportResultReference.get())
.buildUpon()
.setFileSizeBytes(outputVideoFile.length())
.build())
.setElapsedTimeMs(elapsedTimeMs) .setElapsedTimeMs(elapsedTimeMs)
.setFallbackDetails(fallbackDetails) .setFallbackDetails(fallbackDetails)
.setFilePath(outputVideoFile.getPath()); .setFilePath(outputVideoFile.getPath());

View File

@ -94,6 +94,7 @@ import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import java.io.File;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.junit.Before; import org.junit.Before;
@ -186,6 +187,7 @@ public class TransformerEndToEndTest {
// audioSequence duration: ~2s (2 inputs). // audioSequence duration: ~2s (2 inputs).
// loopingAudioSequence: Matches max other sequence (~3.5s) -> 4 inputs of ~1s audio item. // loopingAudioSequence: Matches max other sequence (~3.5s) -> 4 inputs of ~1s audio item.
assertThat(result.exportResult.processedInputs).hasSize(9); assertThat(result.exportResult.processedInputs).hasSize(9);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -226,6 +228,7 @@ public class TransformerEndToEndTest {
// loopingAudioSequence: Matches other sequence (~0.5s) and is cut short. // loopingAudioSequence: Matches other sequence (~0.5s) and is cut short.
assertThat(result.exportResult.durationMs).isAtLeast(450); assertThat(result.exportResult.durationMs).isAtLeast(450);
assertThat(result.exportResult.durationMs).isAtMost(500); assertThat(result.exportResult.durationMs).isAtMost(500);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -250,6 +253,7 @@ public class TransformerEndToEndTest {
// Expected timestamp of the last frame. // Expected timestamp of the last frame.
assertThat(result.exportResult.durationMs) assertThat(result.exportResult.durationMs)
.isEqualTo((C.MILLIS_PER_SECOND / expectedFrameCount) * (expectedFrameCount - 1)); .isEqualTo((C.MILLIS_PER_SECOND / expectedFrameCount) * (expectedFrameCount - 1));
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -271,6 +275,7 @@ public class TransformerEndToEndTest {
// Expected timestamp of the last frame. // Expected timestamp of the last frame.
assertThat(result.exportResult.durationMs) assertThat(result.exportResult.durationMs)
.isEqualTo((C.MILLIS_PER_SECOND / expectedFrameCount) * (expectedFrameCount - 1)); .isEqualTo((C.MILLIS_PER_SECOND / expectedFrameCount) * (expectedFrameCount - 1));
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -325,6 +330,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount); assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount);
// Expected timestamp of the last frame. // Expected timestamp of the last frame.
assertThat(result.exportResult.durationMs).isEqualTo(C.MILLIS_PER_SECOND / 2); assertThat(result.exportResult.durationMs).isEqualTo(C.MILLIS_PER_SECOND / 2);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -376,6 +382,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount); assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount);
// Expected timestamp of the last frame. // Expected timestamp of the last frame.
assertThat(result.exportResult.durationMs).isEqualTo(C.MILLIS_PER_SECOND / 2); assertThat(result.exportResult.durationMs).isEqualTo(C.MILLIS_PER_SECOND / 2);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -402,6 +409,7 @@ public class TransformerEndToEndTest {
.run(testId, editedMediaItem); .run(testId, editedMediaItem);
assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount); assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -437,6 +445,7 @@ public class TransformerEndToEndTest {
.run(testId, editedMediaItem); .run(testId, editedMediaItem);
assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount); assertThat(result.exportResult.videoFrameCount).isEqualTo(expectedFrameCount);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -461,6 +470,7 @@ public class TransformerEndToEndTest {
.run(testId, editedMediaItem); .run(testId, editedMediaItem);
assertThat(result.exportResult.durationMs).isEqualTo(expectedDurationMs); assertThat(result.exportResult.durationMs).isEqualTo(expectedDurationMs);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -489,6 +499,7 @@ public class TransformerEndToEndTest {
.run(testId, mediaItem); .run(testId, mediaItem);
assertThat(result.exportResult.durationMs).isAtMost(clippingEndMs - clippingStartMs); assertThat(result.exportResult.durationMs).isAtMost(clippingEndMs - clippingStartMs);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -565,6 +576,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.durationMs).isAtMost(clippingEndMs - clippingStartMs); assertThat(result.exportResult.durationMs).isAtMost(clippingEndMs - clippingStartMs);
assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED); assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -646,6 +658,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.durationMs).isAtMost(clippingEndMs - clippingStartMs); assertThat(result.exportResult.durationMs).isAtMost(clippingEndMs - clippingStartMs);
assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED); assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -680,6 +693,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.durationMs).isAtMost(1_017); assertThat(result.exportResult.durationMs).isAtMost(1_017);
assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED); assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -714,6 +728,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.videoConversionProcess) assertThat(result.exportResult.videoConversionProcess)
.isEqualTo(CONVERSION_PROCESS_TRANSMUXED_AND_TRANSCODED); .isEqualTo(CONVERSION_PROCESS_TRANSMUXED_AND_TRANSCODED);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -873,6 +888,7 @@ public class TransformerEndToEndTest {
.isEqualTo(OPTIMIZATION_ABANDONED_TRIM_AND_TRANSCODING_TRANSFORMATION_REQUESTED); .isEqualTo(OPTIMIZATION_ABANDONED_TRIM_AND_TRANSCODING_TRANSFORMATION_REQUESTED);
assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED); assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -908,6 +924,7 @@ public class TransformerEndToEndTest {
// 3 / 0.5 + 3 / 0.75 + 3 + 3 / 1.5 + 3.537 / 2 rounds up to 16_770 // 3 / 0.5 + 3 / 0.75 + 3 + 3 / 1.5 + 3.537 / 2 rounds up to 16_770
assertThat(result.exportResult.durationMs).isAtLeast(16_750); assertThat(result.exportResult.durationMs).isAtLeast(16_750);
assertThat(result.exportResult.durationMs).isAtMost(16_770); assertThat(result.exportResult.durationMs).isAtMost(16_770);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -949,6 +966,7 @@ public class TransformerEndToEndTest {
// 3 / 0.5 + 3 / 0.75 + 3 + 3 / 1.5 + 3.537 / 2 rounds up to 16_770 // 3 / 0.5 + 3 / 0.75 + 3 + 3 / 1.5 + 3.537 / 2 rounds up to 16_770
assertThat(result.exportResult.durationMs).isAtLeast(16_720); assertThat(result.exportResult.durationMs).isAtLeast(16_720);
assertThat(result.exportResult.durationMs).isAtMost(16_770); assertThat(result.exportResult.durationMs).isAtMost(16_770);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1003,6 +1021,7 @@ public class TransformerEndToEndTest {
.run(testId, composition); .run(testId, composition);
assertThat(result.exportResult.durationMs).isEqualTo(10_351L); assertThat(result.exportResult.durationMs).isEqualTo(10_351L);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1032,6 +1051,7 @@ public class TransformerEndToEndTest {
.run(testId, composition); .run(testId, composition);
assertThat(result.exportResult.durationMs).isAtMost(20_720L); assertThat(result.exportResult.durationMs).isAtMost(20_720L);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1078,6 +1098,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.videoFrameCount) assertThat(result.exportResult.videoFrameCount)
.isEqualTo(expectedResult.exportResult.videoFrameCount); .isEqualTo(expectedResult.exportResult.videoFrameCount);
assertThat(result.exportResult.durationMs).isEqualTo(expectedResult.exportResult.durationMs); assertThat(result.exportResult.durationMs).isEqualTo(expectedResult.exportResult.durationMs);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1117,6 +1138,7 @@ public class TransformerEndToEndTest {
// will be seen in result.exportResult.durationMs. // will be seen in result.exportResult.durationMs.
assertThat(result.exportResult.durationMs).isAtLeast(2970); assertThat(result.exportResult.durationMs).isAtLeast(2970);
assertThat(result.exportResult.durationMs).isAtMost(3020); assertThat(result.exportResult.durationMs).isAtMost(3020);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1154,6 +1176,7 @@ public class TransformerEndToEndTest {
// will be seen in result.exportResult.durationMs. // will be seen in result.exportResult.durationMs.
assertThat(result.exportResult.durationMs).isAtLeast(3100); assertThat(result.exportResult.durationMs).isAtLeast(3100);
assertThat(result.exportResult.durationMs).isAtMost(3150); assertThat(result.exportResult.durationMs).isAtMost(3150);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1190,6 +1213,7 @@ public class TransformerEndToEndTest {
assertThat(result.exportResult.durationMs).isAtLeast(3120); assertThat(result.exportResult.durationMs).isAtLeast(3120);
assertThat(result.exportResult.durationMs).isAtMost(3140); assertThat(result.exportResult.durationMs).isAtMost(3140);
assertThat(result.exportResult.videoFrameCount).isEqualTo(95); assertThat(result.exportResult.videoFrameCount).isEqualTo(95);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1223,6 +1247,7 @@ public class TransformerEndToEndTest {
// will be seen in result.exportResult.durationMs. // will be seen in result.exportResult.durationMs.
assertThat(result.exportResult.durationMs).isAtLeast(1000); assertThat(result.exportResult.durationMs).isAtLeast(1000);
assertThat(result.exportResult.durationMs).isAtMost(1050); assertThat(result.exportResult.durationMs).isAtMost(1050);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1286,6 +1311,7 @@ public class TransformerEndToEndTest {
.run(testId, composition); .run(testId, composition);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED); assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1306,6 +1332,7 @@ public class TransformerEndToEndTest {
.run(testId, composition); .run(testId, composition);
assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED); assertThat(result.exportResult.audioConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSCODED);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -1592,6 +1619,7 @@ public class TransformerEndToEndTest {
// will be seen in result.exportResult.durationMs. // will be seen in result.exportResult.durationMs.
assertThat(result.exportResult.durationMs).isAtLeast(1_360); assertThat(result.exportResult.durationMs).isAtLeast(1_360);
assertThat(result.exportResult.durationMs).isAtMost(1_400); assertThat(result.exportResult.durationMs).isAtMost(1_400);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
private static AudioProcessor createSonic(float pitch) { private static AudioProcessor createSonic(float pitch) {

View File

@ -34,6 +34,7 @@ import androidx.media3.effect.Presentation;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@ -84,6 +85,7 @@ public class TransformerMixedInputEndToEndTest {
assertThat(result.exportResult.videoFrameCount) assertThat(result.exportResult.videoFrameCount)
.isEqualTo(imageFrameCount + MP4_ASSET_FRAME_COUNT); .isEqualTo(imageFrameCount + MP4_ASSET_FRAME_COUNT);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -109,6 +111,7 @@ public class TransformerMixedInputEndToEndTest {
assertThat(result.exportResult.videoFrameCount) assertThat(result.exportResult.videoFrameCount)
.isEqualTo(imageFrameCount + MP4_ASSET_FRAME_COUNT); .isEqualTo(imageFrameCount + MP4_ASSET_FRAME_COUNT);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -146,6 +149,7 @@ public class TransformerMixedInputEndToEndTest {
assertThat(result.exportResult.videoFrameCount) assertThat(result.exportResult.videoFrameCount)
.isEqualTo(3 * imageFrameCount + 4 * MP4_ASSET_FRAME_COUNT); .isEqualTo(3 * imageFrameCount + 4 * MP4_ASSET_FRAME_COUNT);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -183,6 +187,7 @@ public class TransformerMixedInputEndToEndTest {
assertThat(result.exportResult.videoFrameCount) assertThat(result.exportResult.videoFrameCount)
.isEqualTo(4 * imageFrameCount + 3 * MP4_ASSET_FRAME_COUNT); .isEqualTo(4 * imageFrameCount + 3 * MP4_ASSET_FRAME_COUNT);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
/** Creates an {@link EditedMediaItem} with image, with duration of one second. */ /** Creates an {@link EditedMediaItem} with image, with duration of one second. */

View File

@ -46,6 +46,7 @@ import androidx.media3.effect.VideoCompositorSettings;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.junit.Before; import org.junit.Before;
@ -108,8 +109,7 @@ public final class TransformerMultiSequenceCompositionTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpected( assertBitmapsMatchExpected(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }
@ -143,8 +143,7 @@ public final class TransformerMultiSequenceCompositionTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpected( assertBitmapsMatchExpected(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }
@ -200,8 +199,7 @@ public final class TransformerMultiSequenceCompositionTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpected( assertBitmapsMatchExpected(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }

View File

@ -42,6 +42,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
import com.google.common.base.Ascii; import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -97,13 +98,14 @@ public class TransformerPauseResumeTest {
"Transformer timed out after " + DEFAULT_TIMEOUT_SECONDS + " seconds."); "Transformer timed out after " + DEFAULT_TIMEOUT_SECONDS + " seconds.");
} }
InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel); InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel);
TransformerAndroidTestRunner testRunner =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build();
// Resume the export. // Resume the export.
ExportResult exportResult = testRunner.run(testId, composition, firstOutputPath).exportResult; ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build()
.run(testId, composition, firstOutputPath);
ExportResult exportResult = result.exportResult;
assertThat(exportResult.processedInputs).hasSize(4); assertThat(exportResult.processedInputs).hasSize(4);
assertThat(exportResult.videoFrameCount).isEqualTo(MP4_ASSET_FRAME_COUNT); assertThat(exportResult.videoFrameCount).isEqualTo(MP4_ASSET_FRAME_COUNT);
// The first processed media item corresponds to remuxing previous output video. // The first processed media item corresponds to remuxing previous output video.
@ -120,6 +122,7 @@ public class TransformerPauseResumeTest {
// The fourth processed media item corresponds to transmuxing processed video. // The fourth processed media item corresponds to transmuxing processed video.
assertThat(exportResult.processedInputs.get(3).audioDecoderName).isNull(); assertThat(exportResult.processedInputs.get(3).audioDecoderName).isNull();
assertThat(exportResult.processedInputs.get(3).videoDecoderName).isNull(); assertThat(exportResult.processedInputs.get(3).videoDecoderName).isNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -146,15 +149,16 @@ public class TransformerPauseResumeTest {
}); });
// Resume the export. // Resume the export.
ExportResult exportResult = ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer) new TransformerAndroidTestRunner.Builder(context, transformer)
.build() .build()
.run(testId, composition, firstOutputPath) .run(testId, composition, firstOutputPath);
.exportResult;
ExportResult exportResult = result.exportResult;
// The first export did not progress because of the immediate cancellation hence resuming // The first export did not progress because of the immediate cancellation hence resuming
// actually restarts the export. // actually restarts the export.
assertThat(exportResult.processedInputs).hasSize(1); assertThat(exportResult.processedInputs).hasSize(1);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -190,12 +194,12 @@ public class TransformerPauseResumeTest {
InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel); InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel);
// Resume the export. // Resume the export.
ExportResult exportResultWithResume = ExportTestResult resultWithResume =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build()) new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build() .build()
.run(testId, composition, firstOutputPath) .run(testId, composition, firstOutputPath);
.exportResult;
ExportResult exportResultWithResume = resultWithResume.exportResult;
assertThat(exportResultWithResume.processedInputs).hasSize(4); assertThat(exportResultWithResume.processedInputs).hasSize(4);
assertThat(exportResultWithResume.audioEncoderName) assertThat(exportResultWithResume.audioEncoderName)
.isEqualTo(exportResultWithoutResume.audioEncoderName); .isEqualTo(exportResultWithoutResume.audioEncoderName);
@ -208,6 +212,7 @@ public class TransformerPauseResumeTest {
int maxDiffExpectedInDurationMs = 2; int maxDiffExpectedInDurationMs = 2;
assertThat(exportResultWithResume.durationMs - exportResultWithoutResume.durationMs) assertThat(exportResultWithResume.durationMs - exportResultWithoutResume.durationMs)
.isLessThan(maxDiffExpectedInDurationMs); .isLessThan(maxDiffExpectedInDurationMs);
assertThat(new File(resultWithResume.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -244,12 +249,12 @@ public class TransformerPauseResumeTest {
InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel); InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel);
// Resume the export. // Resume the export.
ExportResult exportResultWithResume = ExportTestResult resultWithResume =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build()) new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build() .build()
.run(testId, composition, firstOutputPath) .run(testId, composition, firstOutputPath);
.exportResult;
ExportResult exportResultWithResume = resultWithResume.exportResult;
assertThat(exportResultWithResume.processedInputs).hasSize(4); assertThat(exportResultWithResume.processedInputs).hasSize(4);
assertThat(exportResultWithResume.audioEncoderName) assertThat(exportResultWithResume.audioEncoderName)
.isEqualTo(exportResultWithoutResume.audioEncoderName); .isEqualTo(exportResultWithoutResume.audioEncoderName);
@ -260,6 +265,7 @@ public class TransformerPauseResumeTest {
int maxDiffExpectedInDurationMs = 2; int maxDiffExpectedInDurationMs = 2;
assertThat(exportResultWithResume.durationMs - exportResultWithoutResume.durationMs) assertThat(exportResultWithResume.durationMs - exportResultWithoutResume.durationMs)
.isLessThan(maxDiffExpectedInDurationMs); .isLessThan(maxDiffExpectedInDurationMs);
assertThat(new File(resultWithResume.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -286,12 +292,13 @@ public class TransformerPauseResumeTest {
"Transformer timed out after " + DEFAULT_TIMEOUT_SECONDS + " seconds."); "Transformer timed out after " + DEFAULT_TIMEOUT_SECONDS + " seconds.");
} }
InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel); InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel);
TransformerAndroidTestRunner testRunner =
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build()) new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build(); .build()
.run(testId, composition, firstOutputPath);
ExportResult exportResult = testRunner.run(testId, composition, firstOutputPath).exportResult;
ExportResult exportResult = result.exportResult;
assertThat(exportResult.processedInputs).hasSize(6); assertThat(exportResult.processedInputs).hasSize(6);
int expectedVideoFrameCount = 2 * MP4_ASSET_FRAME_COUNT; int expectedVideoFrameCount = 2 * MP4_ASSET_FRAME_COUNT;
assertThat(exportResult.videoFrameCount).isEqualTo(expectedVideoFrameCount); assertThat(exportResult.videoFrameCount).isEqualTo(expectedVideoFrameCount);
@ -313,6 +320,7 @@ public class TransformerPauseResumeTest {
// The last processed media item corresponds to transmuxing processed video. // The last processed media item corresponds to transmuxing processed video.
assertThat(exportResult.processedInputs.get(5).audioDecoderName).isNull(); assertThat(exportResult.processedInputs.get(5).audioDecoderName).isNull();
assertThat(exportResult.processedInputs.get(5).videoDecoderName).isNull(); assertThat(exportResult.processedInputs.get(5).videoDecoderName).isNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -346,13 +354,13 @@ public class TransformerPauseResumeTest {
"Transformer timed out after " + DEFAULT_TIMEOUT_SECONDS + " seconds."); "Transformer timed out after " + DEFAULT_TIMEOUT_SECONDS + " seconds.");
} }
InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel); InstrumentationRegistry.getInstrumentation().runOnMainSync(blockingTransformer::cancel);
TransformerAndroidTestRunner testRunner =
ExportTestResult resultWithResume =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build()) new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build(); .build()
.run(testId, composition, firstOutputPath);
ExportResult exportResultWithResume =
testRunner.run(testId, composition, firstOutputPath).exportResult;
ExportResult exportResultWithResume = resultWithResume.exportResult;
assertThat(exportResultWithResume.processedInputs).hasSize(6); assertThat(exportResultWithResume.processedInputs).hasSize(6);
assertThat(exportResultWithResume.audioEncoderName) assertThat(exportResultWithResume.audioEncoderName)
.isEqualTo(exportResultWithoutResume.audioEncoderName); .isEqualTo(exportResultWithoutResume.audioEncoderName);
@ -363,6 +371,7 @@ public class TransformerPauseResumeTest {
int maxDiffExpectedInDurationMs = 2; int maxDiffExpectedInDurationMs = 2;
assertThat(exportResultWithResume.durationMs - exportResultWithoutResume.durationMs) assertThat(exportResultWithResume.durationMs - exportResultWithoutResume.durationMs)
.isLessThan(maxDiffExpectedInDurationMs); .isLessThan(maxDiffExpectedInDurationMs);
assertThat(new File(resultWithResume.filePath).length()).isGreaterThan(0);
} }
private static Composition buildSingleSequenceComposition( private static Composition buildSingleSequenceComposition(

View File

@ -71,6 +71,7 @@ import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.base.Ascii; import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.junit.After; import org.junit.After;
@ -140,8 +141,7 @@ public final class TransformerSequenceEffectTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }
@ -174,7 +174,7 @@ public final class TransformerSequenceEffectTest {
} }
atLeastOneDecoderSucceeds = true; atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave( assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD); context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD);
} }
@ -214,7 +214,7 @@ public final class TransformerSequenceEffectTest {
} }
atLeastOneDecoderSucceeds = true; atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave( assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD); context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD);
} }
@ -252,7 +252,7 @@ public final class TransformerSequenceEffectTest {
} }
atLeastOneDecoderSucceeds = true; atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave( assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD); context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD);
} }
@ -293,7 +293,7 @@ public final class TransformerSequenceEffectTest {
} }
atLeastOneDecoderSucceeds = true; atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave( assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD); context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD);
} }
@ -335,7 +335,7 @@ public final class TransformerSequenceEffectTest {
} }
atLeastOneDecoderSucceeds = true; atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave( assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD); context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD);
} }
@ -388,7 +388,7 @@ public final class TransformerSequenceEffectTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(checkNotNull(result).filePath).isNotNull(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
// The PSNR threshold was chosen based on: // The PSNR threshold was chosen based on:
// Pixel 8 with coordinate rounding error during texture sampling, hits PSNR 23.4. With fix -> // Pixel 8 with coordinate rounding error during texture sampling, hits PSNR 23.4. With fix ->
// 29.5 // 29.5
@ -438,8 +438,7 @@ public final class TransformerSequenceEffectTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }
@ -462,8 +461,7 @@ public final class TransformerSequenceEffectTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }
@ -487,8 +485,7 @@ public final class TransformerSequenceEffectTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }
@ -513,8 +510,7 @@ public final class TransformerSequenceEffectTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }
@ -539,8 +535,7 @@ public final class TransformerSequenceEffectTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId); extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
} }

View File

@ -24,7 +24,6 @@ import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported
import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL; import static androidx.media3.transformer.Composition.HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL;
import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT; import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT;
import static androidx.media3.transformer.SequenceEffectTestUtil.oneFrameFromImage; import static androidx.media3.transformer.SequenceEffectTestUtil.oneFrameFromImage;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
import android.content.Context; import android.content.Context;
@ -94,8 +93,6 @@ public final class TransformerUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath); assertSdrColors(context, result.filePath);
} }
@ -116,8 +113,6 @@ public final class TransformerUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath); assertSdrColors(context, result.filePath);
} }
@ -139,8 +134,6 @@ public final class TransformerUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath); assertSdrColors(context, result.filePath);
} }
@ -155,8 +148,6 @@ public final class TransformerUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath); assertSdrColors(context, result.filePath);
} }
@ -173,8 +164,6 @@ public final class TransformerUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath); assertSdrColors(context, result.filePath);
} }

View File

@ -18,6 +18,7 @@ package androidx.media3.transformer;
import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT; import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported; import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
import android.content.Context; import android.content.Context;
@ -29,6 +30,7 @@ import androidx.media3.common.audio.ChannelMixingMatrix;
import androidx.media3.effect.RgbFilter; import androidx.media3.effect.RgbFilter;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -71,9 +73,12 @@ public class TransformerWithInAppMuxerEndToEndAndroidTest {
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects)) .setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
.build(); .build();
new TransformerAndroidTestRunner.Builder(context, transformer) ExportTestResult result =
.build() new TransformerAndroidTestRunner.Builder(context, transformer)
.run(testId, editedMediaItem); .build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -98,8 +103,11 @@ public class TransformerWithInAppMuxerEndToEndAndroidTest {
/* videoEffects= */ ImmutableList.of())) /* videoEffects= */ ImmutableList.of()))
.build(); .build();
new TransformerAndroidTestRunner.Builder(context, transformer) ExportTestResult result =
.build() new TransformerAndroidTestRunner.Builder(context, transformer)
.run(testId, editedMediaItem); .build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
} }

View File

@ -63,6 +63,7 @@ import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.base.Ascii; import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import org.junit.AssumptionViolatedException; import org.junit.AssumptionViolatedException;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
@ -93,7 +94,6 @@ public class ExportTest {
testId, testId,
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT, /* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
/* outputFormat= */ null); /* outputFormat= */ null);
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context)) .setEncoderFactory(new ForceEncodeEncoderFactory(context))
@ -103,10 +103,14 @@ public class ExportTest {
boolean skipCalculateSsim = boolean skipCalculateSsim =
(Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1"))) (Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1")))
|| (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121")); || (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121"));
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim) ExportTestResult result =
.build() new TransformerAndroidTestRunner.Builder(context, transformer)
.run(testId, mediaItem); .setRequestCalculateSsim(!skipCalculateSsim)
.build()
.run(testId, mediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -116,7 +120,13 @@ public class ExportTest {
MediaItem mediaItem = MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
// No need to calculate SSIM because no decode/encoding, so input frames match output frames. // No need to calculate SSIM because no decode/encoding, so input frames match output frames.
new TransformerAndroidTestRunner.Builder(context, transformer).build().run(testId, mediaItem);
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, mediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -143,10 +153,14 @@ public class ExportTest {
boolean skipCalculateSsim = boolean skipCalculateSsim =
(Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1"))) (Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1")))
|| (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121")); || (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121"));
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim) ExportTestResult result =
.build() new TransformerAndroidTestRunner.Builder(context, transformer)
.run(testId, editedMediaItem); .setRequestCalculateSsim(!skipCalculateSsim)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -161,18 +175,21 @@ public class ExportTest {
assumeFalse( assumeFalse(
"Skip due to over-reported encoder capabilities", "Skip due to over-reported encoder capabilities",
Util.SDK_INT == 29 && Ascii.equalsIgnoreCase(Util.MODEL, "pixel 3")); Util.SDK_INT == 29 && Ascii.equalsIgnoreCase(Util.MODEL, "pixel 3"));
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context)) .setEncoderFactory(new ForceEncodeEncoderFactory(context))
.build(); .build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_4K60_PORTRAIT_URI_STRING)); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_4K60_PORTRAIT_URI_STRING));
boolean skipCalculateSsim = Util.SDK_INT < 30 && Util.DEVICE.equals("joyeuse"); boolean skipCalculateSsim = Util.SDK_INT < 30 && Util.DEVICE.equals("joyeuse");
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim) ExportTestResult result =
.setTimeoutSeconds(180) new TransformerAndroidTestRunner.Builder(context, transformer)
.build() .setRequestCalculateSsim(!skipCalculateSsim)
.run(testId, mediaItem); .setTimeoutSeconds(180)
.build()
.run(testId, mediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -184,11 +201,9 @@ public class ExportTest {
|| Ascii.equalsIgnoreCase(Util.MODEL, "sm-f916u1") || Ascii.equalsIgnoreCase(Util.MODEL, "sm-f916u1")
|| Ascii.equalsIgnoreCase(Util.MODEL, "sm-g981u1") || Ascii.equalsIgnoreCase(Util.MODEL, "sm-g981u1")
|| Ascii.equalsIgnoreCase(Util.MODEL, "le2121")); || Ascii.equalsIgnoreCase(Util.MODEL, "le2121"));
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
assumeFormatsSupported( assumeFormatsSupported(
context, testId, /* inputFormat= */ MP4_ASSET_8K24_FORMAT, /* outputFormat= */ null); context, testId, /* inputFormat= */ MP4_ASSET_8K24_FORMAT, /* outputFormat= */ null);
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context)) .setEncoderFactory(new ForceEncodeEncoderFactory(context))
@ -196,11 +211,15 @@ public class ExportTest {
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24_URI_STRING)); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24_URI_STRING));
// TODO: b/281824052 - have requestCalculateSsim always be true after linked bug is fixed. // TODO: b/281824052 - have requestCalculateSsim always be true after linked bug is fixed.
boolean requestCalculateSsim = !Util.MODEL.equals("SM-G991B"); boolean requestCalculateSsim = !Util.MODEL.equals("SM-G991B");
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(requestCalculateSsim) ExportTestResult result =
.setTimeoutSeconds(120) new TransformerAndroidTestRunner.Builder(context, transformer)
.build() .setRequestCalculateSsim(requestCalculateSsim)
.run(testId, mediaItem); .setTimeoutSeconds(120)
.build()
.run(testId, mediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -208,7 +227,6 @@ public class ExportTest {
// This test is to cover devices that are able to either decode or encode 8K, but not transcode. // This test is to cover devices that are able to either decode or encode 8K, but not transcode.
int downscaledWidth = 320; int downscaledWidth = 320;
int downscaledHeight = 240; int downscaledHeight = 240;
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
assumeFormatsSupported( assumeFormatsSupported(
context, context,
@ -220,21 +238,24 @@ public class ExportTest {
.setHeight(downscaledHeight) .setHeight(downscaledHeight)
.build()); .build());
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build()) ExportTestResult result =
.setTimeoutSeconds(120) new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.build() .setTimeoutSeconds(120)
.run( .build()
testId, .run(
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24_URI_STRING))) testId,
.setEffects( new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24_URI_STRING)))
new Effects( .setEffects(
/* audioProcessors= */ ImmutableList.of(), new Effects(
/* videoEffects= */ ImmutableList.of( /* audioProcessors= */ ImmutableList.of(),
Presentation.createForWidthAndHeight( /* videoEffects= */ ImmutableList.of(
downscaledWidth, Presentation.createForWidthAndHeight(
downscaledHeight, downscaledWidth,
Presentation.LAYOUT_SCALE_TO_FIT)))) downscaledHeight,
.build()); Presentation.LAYOUT_SCALE_TO_FIT))))
.build());
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -245,7 +266,6 @@ public class ExportTest {
testId, testId,
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT, /* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
/* outputFormat= */ null); /* outputFormat= */ null);
Transformer transformer = Transformer transformer =
new Transformer.Builder(context) new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context)) .setEncoderFactory(new ForceEncodeEncoderFactory(context))
@ -257,10 +277,14 @@ public class ExportTest {
boolean skipCalculateSsim = boolean skipCalculateSsim =
(Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1"))) (Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1")))
|| (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121")); || (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121"));
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim) ExportTestResult result =
.build() new TransformerAndroidTestRunner.Builder(context, transformer)
.run(testId, editedMediaItem); .setRequestCalculateSsim(!skipCalculateSsim)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -274,27 +298,30 @@ public class ExportTest {
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING))) new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
.setRemoveVideo(true) .setRemoveVideo(true)
.build(); .build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.build() ExportTestResult result =
.run(testId, editedMediaItem); new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
public void exportSef() throws Exception { public void exportSef() throws Exception {
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
if (SDK_INT < 25) { if (SDK_INT < 25) {
// TODO(b/210593256): Remove test skipping after using an in-app muxer that supports B-frames // TODO(b/210593256): Remove test skipping after using an in-app muxer that supports B-frames
// before API 25. // before API 25.
recordTestSkipped(context, testId, /* reason= */ "API version lacks muxing support"); recordTestSkipped(context, testId, /* reason= */ "API version lacks muxing support");
return; return;
} }
Transformer transformer = new Transformer.Builder(context).build(); Transformer transformer = new Transformer.Builder(context).build();
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_URI_STRING))) new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_URI_STRING)))
.setFlattenForSlowMotion(true) .setFlattenForSlowMotion(true)
.build(); .build();
ExportTestResult result = ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer) new TransformerAndroidTestRunner.Builder(context, transformer)
.build() .build()
@ -302,27 +329,30 @@ public class ExportTest {
assertThat(result.exportResult.durationMs).isGreaterThan(800); assertThat(result.exportResult.durationMs).isGreaterThan(800);
assertThat(result.exportResult.durationMs).isLessThan(950); assertThat(result.exportResult.durationMs).isLessThan(950);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
public void exportSefH265() throws Exception { public void exportSefH265() throws Exception {
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
if (SDK_INT < 25) { if (SDK_INT < 25) {
// TODO(b/210593256): Remove test skipping after using an in-app muxer that supports B-frames // TODO(b/210593256): Remove test skipping after using an in-app muxer that supports B-frames
// before API 25. // before API 25.
recordTestSkipped(context, testId, /* reason= */ "API version lacks muxing support"); recordTestSkipped(context, testId, /* reason= */ "API version lacks muxing support");
return; return;
} }
Transformer transformer = new Transformer.Builder(context).build(); Transformer transformer = new Transformer.Builder(context).build();
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_H265_URI_STRING))) new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_H265_URI_STRING)))
.setFlattenForSlowMotion(true) .setFlattenForSlowMotion(true)
.build(); .build();
new TransformerAndroidTestRunner.Builder(context, transformer)
.build() ExportTestResult result =
.run(testId, editedMediaItem); new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -333,7 +363,6 @@ public class ExportTest {
testId, testId,
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT, /* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
/* outputFormat= */ null); /* outputFormat= */ null);
Transformer transformer = new Transformer.Builder(context).build(); Transformer transformer = new Transformer.Builder(context).build();
MediaItem mediaItem = MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING)); MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
@ -343,9 +372,12 @@ public class ExportTest {
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build(); new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
new TransformerAndroidTestRunner.Builder(context, transformer) ExportTestResult result =
.build() new TransformerAndroidTestRunner.Builder(context, transformer)
.run(testId, editedMediaItem); .build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -359,15 +391,17 @@ public class ExportTest {
} }
assumeFormatsSupported( assumeFormatsSupported(
context, testId, /* inputFormat= */ MP4_ASSET_BT2020_SDR_FORMAT, /* outputFormat= */ null); context, testId, /* inputFormat= */ MP4_ASSET_BT2020_SDR_FORMAT, /* outputFormat= */ null);
Transformer transformer = new Transformer.Builder(context).build(); Transformer transformer = new Transformer.Builder(context).build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_BT2020_SDR)); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_BT2020_SDR));
EditedMediaItem editedMediaItem = EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build(); new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
new TransformerAndroidTestRunner.Builder(context, transformer) ExportTestResult result =
.build() new TransformerAndroidTestRunner.Builder(context, transformer)
.run(testId, editedMediaItem); .build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
@Test @Test
@ -399,6 +433,7 @@ public class ExportTest {
new TransformerAndroidTestRunner.Builder(context, transformer) new TransformerAndroidTestRunner.Builder(context, transformer)
.build() .build()
.run(testId, editedMediaItem); .run(testId, editedMediaItem);
Mp4Extractor mp4Extractor = new Mp4Extractor(new DefaultSubtitleParserFactory()); Mp4Extractor mp4Extractor = new Mp4Extractor(new DefaultSubtitleParserFactory());
FakeExtractorOutput fakeExtractorOutput = FakeExtractorOutput fakeExtractorOutput =
TestUtil.extractAllSamplesFromFilePath(mp4Extractor, result.filePath); TestUtil.extractAllSamplesFromFilePath(mp4Extractor, result.filePath);
@ -406,7 +441,6 @@ public class ExportTest {
byte[] sps = videoTrack.lastFormat.initializationData.get(0); byte[] sps = videoTrack.lastFormat.initializationData.get(0);
// Skip 7 bytes: NAL unit start code (4) and NAL unit type, profile, and reserved fields. // Skip 7 bytes: NAL unit start code (4) and NAL unit type, profile, and reserved fields.
int spsLevelIndex = 7; int spsLevelIndex = 7;
assertThat(result.exportResult.optimizationResult).isEqualTo(OPTIMIZATION_SUCCEEDED); assertThat(result.exportResult.optimizationResult).isEqualTo(OPTIMIZATION_SUCCEEDED);
assertThat(result.exportResult.durationMs).isAtMost(700); assertThat(result.exportResult.durationMs).isAtMost(700);
assertThat(result.exportResult.videoConversionProcess) assertThat(result.exportResult.videoConversionProcess)

View File

@ -83,8 +83,6 @@ public final class TransformerMhUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
ColorInfo colorInfo = ColorInfo colorInfo =
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo; retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020); assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
@ -105,8 +103,6 @@ public final class TransformerMhUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
ColorInfo colorInfo = ColorInfo colorInfo =
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo; retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020); assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
@ -127,8 +123,6 @@ public final class TransformerMhUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
ColorInfo colorInfo = ColorInfo colorInfo =
retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo; retrieveTrackFormat(context, result.filePath, C.TRACK_TYPE_VIDEO).colorInfo;
assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020); assertThat(colorInfo.colorSpace).isEqualTo(C.COLOR_SPACE_BT2020);
@ -149,8 +143,6 @@ public final class TransformerMhUltraHdrTest {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath); assertSdrColors(context, result.filePath);
} }

View File

@ -59,6 +59,7 @@ import androidx.media3.transformer.TransformerAndroidTestRunner;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import java.util.List; import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
@ -107,8 +108,7 @@ public final class TransformerSequenceEffectTestWithHdr {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
// Expected bitmaps were generated on the Pixel 7 Pro, because emulators don't // Expected bitmaps were generated on the Pixel 7 Pro, because emulators don't
// support decoding HDR. // support decoding HDR.
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(
@ -186,8 +186,7 @@ public final class TransformerSequenceEffectTestWithHdr {
.build() .build()
.run(testId, composition); .run(testId, composition);
assertThat(result.filePath).isNotEmpty(); assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
// Expected bitmaps were generated on the Samsung S22 Ultra (US), because emulators don't // Expected bitmaps were generated on the Samsung S22 Ultra (US), because emulators don't
// support decoding HDR, and the Pixel 7 Pro does support HDR editing. // support decoding HDR, and the Pixel 7 Pro does support HDR editing.
assertBitmapsMatchExpectedAndSave( assertBitmapsMatchExpectedAndSave(

View File

@ -34,6 +34,7 @@ import androidx.media3.transformer.TransformerAndroidTestRunner;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.io.File;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
@ -74,5 +75,6 @@ public class TransformerWithInAppMuxerEndToEndMhTest {
.run(testId, editedMediaItem); .run(testId, editedMediaItem);
assertThat(result.exportResult.exportException).isNull(); assertThat(result.exportResult.exportException).isNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
} }
} }