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(
Context context, String fileUri, @C.TrackType int trackType)
throws ExecutionException, InterruptedException {
checkState(new File(fileUri).length() > 0);
TrackGroupArray trackGroupArray;
trackGroupArray = MetadataRetriever.retrieveMetadata(context, MediaItem.fromUri(fileUri)).get();
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.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import org.json.JSONException;
@ -81,6 +82,7 @@ public class ForceEndOfStreamTest {
assertThat(testResult.analysisException).isNull();
assertThat(testResult.exportResult.videoFrameCount)
.isEqualTo(MP4_ASSET_FRAME_COUNT - framesToSkip);
assertThat(new File(testResult.filePath).length()).isGreaterThan(0);
}
@Test
@ -100,6 +102,7 @@ public class ForceEndOfStreamTest {
assertThat(testResult.analysisException).isNull();
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)

View File

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

View File

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

View File

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

View File

@ -71,6 +71,7 @@ import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.junit.After;
@ -140,8 +141,7 @@ public final class TransformerSequenceEffectTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
}
@ -174,7 +174,7 @@ public final class TransformerSequenceEffectTest {
}
atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD);
}
@ -214,7 +214,7 @@ public final class TransformerSequenceEffectTest {
}
atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD);
}
@ -252,7 +252,7 @@ public final class TransformerSequenceEffectTest {
}
atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD);
}
@ -293,7 +293,7 @@ public final class TransformerSequenceEffectTest {
}
atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD_HD);
}
@ -335,7 +335,7 @@ public final class TransformerSequenceEffectTest {
}
atLeastOneDecoderSucceeds = true;
assertThat(checkNotNull(result).filePath).isNotNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertFirstFrameMatchesExpectedPsnrAndSave(
context, testId, checkNotNull(result.filePath), PSNR_THRESHOLD);
}
@ -388,7 +388,7 @@ public final class TransformerSequenceEffectTest {
.build()
.run(testId, composition);
assertThat(checkNotNull(result).filePath).isNotNull();
assertThat(new File(result.filePath).length()).isGreaterThan(0);
// The PSNR threshold was chosen based on:
// Pixel 8 with coordinate rounding error during texture sampling, hits PSNR 23.4. With fix ->
// 29.5
@ -438,8 +438,7 @@ public final class TransformerSequenceEffectTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
}
@ -462,8 +461,7 @@ public final class TransformerSequenceEffectTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
}
@ -487,8 +485,7 @@ public final class TransformerSequenceEffectTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
}
@ -513,8 +510,7 @@ public final class TransformerSequenceEffectTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave(
extractBitmapsFromVideo(context, checkNotNull(result.filePath)), testId);
}
@ -539,8 +535,7 @@ public final class TransformerSequenceEffectTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
assertBitmapsMatchExpectedAndSave(
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.SequenceEffectTestUtil.NO_EFFECT;
import static androidx.media3.transformer.SequenceEffectTestUtil.oneFrameFromImage;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assume.assumeTrue;
import android.content.Context;
@ -94,8 +93,6 @@ public final class TransformerUltraHdrTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath);
}
@ -116,8 +113,6 @@ public final class TransformerUltraHdrTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath);
}
@ -139,8 +134,6 @@ public final class TransformerUltraHdrTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath);
}
@ -155,8 +148,6 @@ public final class TransformerUltraHdrTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
assertSdrColors(context, result.filePath);
}
@ -173,8 +164,6 @@ public final class TransformerUltraHdrTest {
.build()
.run(testId, composition);
assertThat(result.filePath).isNotEmpty();
assertThat(result.exportResult.fileSizeBytes).isGreaterThan(0);
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.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assume.assumeTrue;
import android.content.Context;
@ -29,6 +30,7 @@ import androidx.media3.common.audio.ChannelMixingMatrix;
import androidx.media3.effect.RgbFilter;
import androidx.test.core.app.ApplicationProvider;
import com.google.common.collect.ImmutableList;
import java.io.File;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -71,9 +73,12 @@ public class TransformerWithInAppMuxerEndToEndAndroidTest {
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -98,8 +103,11 @@ public class TransformerWithInAppMuxerEndToEndAndroidTest {
/* videoEffects= */ ImmutableList.of()))
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.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 com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
import java.io.File;
import org.junit.AssumptionViolatedException;
import org.junit.Before;
import org.junit.Rule;
@ -93,7 +94,6 @@ public class ExportTest {
testId,
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
/* outputFormat= */ null);
Transformer transformer =
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
@ -103,10 +103,14 @@ public class ExportTest {
boolean skipCalculateSsim =
(Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1")))
|| (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121"));
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim)
.build()
.run(testId, mediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -116,7 +120,13 @@ public class ExportTest {
MediaItem mediaItem =
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.
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
@ -143,10 +153,14 @@ public class ExportTest {
boolean skipCalculateSsim =
(Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1")))
|| (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121"));
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -161,18 +175,21 @@ public class ExportTest {
assumeFalse(
"Skip due to over-reported encoder capabilities",
Util.SDK_INT == 29 && Ascii.equalsIgnoreCase(Util.MODEL, "pixel 3"));
Transformer transformer =
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
.build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_4K60_PORTRAIT_URI_STRING));
boolean skipCalculateSsim = Util.SDK_INT < 30 && Util.DEVICE.equals("joyeuse");
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim)
.setTimeoutSeconds(180)
.build()
.run(testId, mediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -184,11 +201,9 @@ public class ExportTest {
|| Ascii.equalsIgnoreCase(Util.MODEL, "sm-f916u1")
|| Ascii.equalsIgnoreCase(Util.MODEL, "sm-g981u1")
|| Ascii.equalsIgnoreCase(Util.MODEL, "le2121"));
Context context = ApplicationProvider.getApplicationContext();
assumeFormatsSupported(
context, testId, /* inputFormat= */ MP4_ASSET_8K24_FORMAT, /* outputFormat= */ null);
Transformer transformer =
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
@ -196,11 +211,15 @@ public class ExportTest {
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24_URI_STRING));
// TODO: b/281824052 - have requestCalculateSsim always be true after linked bug is fixed.
boolean requestCalculateSsim = !Util.MODEL.equals("SM-G991B");
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(requestCalculateSsim)
.setTimeoutSeconds(120)
.build()
.run(testId, mediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@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.
int downscaledWidth = 320;
int downscaledHeight = 240;
Context context = ApplicationProvider.getApplicationContext();
assumeFormatsSupported(
context,
@ -220,6 +238,7 @@ public class ExportTest {
.setHeight(downscaledHeight)
.build());
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
.setTimeoutSeconds(120)
.build()
@ -235,6 +254,8 @@ public class ExportTest {
downscaledHeight,
Presentation.LAYOUT_SCALE_TO_FIT))))
.build());
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -245,7 +266,6 @@ public class ExportTest {
testId,
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
/* outputFormat= */ null);
Transformer transformer =
new Transformer.Builder(context)
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
@ -257,10 +277,14 @@ public class ExportTest {
boolean skipCalculateSsim =
(Util.SDK_INT < 33 && (Util.MODEL.equals("SM-F711U1") || Util.MODEL.equals("SM-F926U1")))
|| (Util.SDK_INT == 33 && Util.MODEL.equals("LE2121"));
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.setRequestCalculateSsim(!skipCalculateSsim)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -274,27 +298,30 @@ public class ExportTest {
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
.setRemoveVideo(true)
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
public void exportSef() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
if (SDK_INT < 25) {
// TODO(b/210593256): Remove test skipping after using an in-app muxer that supports B-frames
// before API 25.
recordTestSkipped(context, testId, /* reason= */ "API version lacks muxing support");
return;
}
Transformer transformer = new Transformer.Builder(context).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_URI_STRING)))
.setFlattenForSlowMotion(true)
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
@ -302,27 +329,30 @@ public class ExportTest {
assertThat(result.exportResult.durationMs).isGreaterThan(800);
assertThat(result.exportResult.durationMs).isLessThan(950);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
public void exportSefH265() throws Exception {
Context context = ApplicationProvider.getApplicationContext();
if (SDK_INT < 25) {
// TODO(b/210593256): Remove test skipping after using an in-app muxer that supports B-frames
// before API 25.
recordTestSkipped(context, testId, /* reason= */ "API version lacks muxing support");
return;
}
Transformer transformer = new Transformer.Builder(context).build();
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_SEF_H265_URI_STRING)))
.setFlattenForSlowMotion(true)
.build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -333,7 +363,6 @@ public class ExportTest {
testId,
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
/* outputFormat= */ null);
Transformer transformer = new Transformer.Builder(context).build();
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
@ -343,9 +372,12 @@ public class ExportTest {
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(effects).build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -359,15 +391,17 @@ public class ExportTest {
}
assumeFormatsSupported(
context, testId, /* inputFormat= */ MP4_ASSET_BT2020_SDR_FORMAT, /* outputFormat= */ null);
Transformer transformer = new Transformer.Builder(context).build();
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_BT2020_SDR));
EditedMediaItem editedMediaItem =
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
ExportTestResult result =
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
assertThat(new File(result.filePath).length()).isGreaterThan(0);
}
@Test
@ -399,6 +433,7 @@ public class ExportTest {
new TransformerAndroidTestRunner.Builder(context, transformer)
.build()
.run(testId, editedMediaItem);
Mp4Extractor mp4Extractor = new Mp4Extractor(new DefaultSubtitleParserFactory());
FakeExtractorOutput fakeExtractorOutput =
TestUtil.extractAllSamplesFromFilePath(mp4Extractor, result.filePath);
@ -406,7 +441,6 @@ public class ExportTest {
byte[] sps = videoTrack.lastFormat.initializationData.get(0);
// Skip 7 bytes: NAL unit start code (4) and NAL unit type, profile, and reserved fields.
int spsLevelIndex = 7;
assertThat(result.exportResult.optimizationResult).isEqualTo(OPTIMIZATION_SUCCEEDED);
assertThat(result.exportResult.durationMs).isAtMost(700);
assertThat(result.exportResult.videoConversionProcess)

View File

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

View File

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

View File

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