mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Create an AssetInfo class for AndroidTestUtil test asset information.
This is an internal refactor with no logic changed. There is a duplication in information and a lack of consistency around the use of test assets in transformer androidTest. This change refactors each asset to be defined as its own AssetInfo, with the other relevant parts stored alongside the uri. Once this is in place, we can consider other useful functionality, such as having boolean flags for what tracks an asset has, helper methods for whether an asset is local or remote, and more. This will reduce the manual overhead necessary to use more assets in tests, and in particular leads towards easily using new & existing assets in parameterized tests. PiperOrigin-RevId: 644040595
This commit is contained in:
parent
d0815d3f7b
commit
2b55a5bc2d
File diff suppressed because it is too large
Load Diff
@ -16,8 +16,8 @@
|
|||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import static androidx.media3.common.PlaybackException.ERROR_CODE_DECODER_INIT_FAILED;
|
import static androidx.media3.common.PlaybackException.ERROR_CODE_DECODER_INIT_FAILED;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_SINGLE_PIXEL_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_SINGLE_PIXEL_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static com.google.common.util.concurrent.Futures.immediateFuture;
|
import static com.google.common.util.concurrent.Futures.immediateFuture;
|
||||||
import static org.junit.Assert.assertThrows;
|
import static org.junit.Assert.assertThrows;
|
||||||
@ -122,7 +122,7 @@ public class CompositionPlayerTest {
|
|||||||
compositionPlayer.setComposition(
|
compositionPlayer.setComposition(
|
||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build()))
|
.build()))
|
||||||
.build());
|
.build());
|
||||||
@ -142,7 +142,7 @@ public class CompositionPlayerTest {
|
|||||||
compositionPlayer.setComposition(
|
compositionPlayer.setComposition(
|
||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build()))
|
.build()))
|
||||||
.build());
|
.build());
|
||||||
@ -166,7 +166,7 @@ public class CompositionPlayerTest {
|
|||||||
compositionPlayer.setComposition(
|
compositionPlayer.setComposition(
|
||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build()))
|
.build()))
|
||||||
.build());
|
.build());
|
||||||
@ -188,7 +188,7 @@ public class CompositionPlayerTest {
|
|||||||
compositionPlayer.setComposition(
|
compositionPlayer.setComposition(
|
||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build()))
|
.build()))
|
||||||
.build());
|
.build());
|
||||||
@ -232,7 +232,7 @@ public class CompositionPlayerTest {
|
|||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(1_000)
|
.setImageDurationMs(1_000)
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
@ -273,7 +273,7 @@ public class CompositionPlayerTest {
|
|||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE)
|
.setMimeType(MimeTypes.APPLICATION_EXTERNALLY_LOADED_IMAGE)
|
||||||
.setImageDurationMs(1_000)
|
.setImageDurationMs(1_000)
|
||||||
.build())
|
.build())
|
||||||
@ -292,7 +292,7 @@ public class CompositionPlayerTest {
|
|||||||
EditedMediaItem image =
|
EditedMediaItem image =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(500)
|
.setImageDurationMs(500)
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(500_000)
|
.setDurationUs(500_000)
|
||||||
@ -320,14 +320,14 @@ public class CompositionPlayerTest {
|
|||||||
EditedMediaItem image =
|
EditedMediaItem image =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(500)
|
.setImageDurationMs(500)
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(500_000)
|
.setDurationUs(500_000)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -351,13 +351,13 @@ public class CompositionPlayerTest {
|
|||||||
public void composition_videoThenImage() throws Exception {
|
public void composition_videoThenImage() throws Exception {
|
||||||
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem image =
|
EditedMediaItem image =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(500)
|
.setImageDurationMs(500)
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(500_000)
|
.setDurationUs(500_000)
|
||||||
@ -383,7 +383,7 @@ public class CompositionPlayerTest {
|
|||||||
public void playback_videoSinkProviderFails_playerRaisesError() {
|
public void playback_videoSinkProviderFails_playerRaisesError() {
|
||||||
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -420,7 +420,7 @@ public class CompositionPlayerTest {
|
|||||||
throws Exception {
|
throws Exception {
|
||||||
PlayerTestListener playerTestListener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
PlayerTestListener playerTestListener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.build();
|
.build();
|
||||||
instrumentation.runOnMainSync(
|
instrumentation.runOnMainSync(
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FRAME_COUNT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@ -70,18 +69,20 @@ public class ForceEndOfStreamTest {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
int framesToSkip = 4;
|
int framesToSkip = 4;
|
||||||
|
|
||||||
ExportTestResult testResult =
|
ExportTestResult testResult =
|
||||||
new TransformerAndroidTestRunner.Builder(context, buildTransformer(context, framesToSkip))
|
new TransformerAndroidTestRunner.Builder(context, buildTransformer(context, framesToSkip))
|
||||||
.build()
|
.build()
|
||||||
.run(
|
.run(testId, createComposition(MediaItem.fromUri(MP4_ASSET.uri)));
|
||||||
testId, createComposition(MediaItem.fromUri(AndroidTestUtil.MP4_ASSET_URI_STRING)));
|
|
||||||
|
|
||||||
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.videoFrameCount - framesToSkip);
|
||||||
assertThat(new File(testResult.filePath).length()).isGreaterThan(0);
|
assertThat(new File(testResult.filePath).length()).isGreaterThan(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,17 +92,19 @@ public class ForceEndOfStreamTest {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
|
|
||||||
ExportTestResult testResult =
|
ExportTestResult testResult =
|
||||||
new TransformerAndroidTestRunner.Builder(
|
new TransformerAndroidTestRunner.Builder(
|
||||||
context, buildTransformer(context, /* framesToSkip= */ 0))
|
context, buildTransformer(context, /* framesToSkip= */ 0))
|
||||||
.build()
|
.build()
|
||||||
.run(
|
.run(testId, createComposition(MediaItem.fromUri(MP4_ASSET.uri)));
|
||||||
testId, createComposition(MediaItem.fromUri(AndroidTestUtil.MP4_ASSET_URI_STRING)));
|
|
||||||
|
|
||||||
assertThat(testResult.analysisException).isNull();
|
assertThat(testResult.analysisException).isNull();
|
||||||
assertThat(testResult.exportResult.videoFrameCount).isEqualTo(MP4_ASSET_FRAME_COUNT);
|
assertThat(testResult.exportResult.videoFrameCount).isEqualTo(MP4_ASSET.videoFrameCount);
|
||||||
assertThat(new File(testResult.filePath).length()).isGreaterThan(0);
|
assertThat(new File(testResult.filePath).length()).isGreaterThan(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +123,7 @@ public class ForceEndOfStreamTest {
|
|||||||
.setAssetLoaderFactory(
|
.setAssetLoaderFactory(
|
||||||
new DefaultAssetLoaderFactory(
|
new DefaultAssetLoaderFactory(
|
||||||
context,
|
context,
|
||||||
new FrameDroppingDecoderFactory(context, MP4_ASSET_FRAME_COUNT, framesToSkip),
|
new FrameDroppingDecoderFactory(context, MP4_ASSET.videoFrameCount, framesToSkip),
|
||||||
Clock.DEFAULT))
|
Clock.DEFAULT))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
@ -17,13 +17,10 @@
|
|||||||
|
|
||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.BT601_MP4_ASSET_FRAME_COUNT;
|
import static androidx.media3.transformer.AndroidTestUtil.BT601_MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.BT601_MP4_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FRAME_COUNT;
|
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.getFormatForTestFile;
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@ -36,6 +33,7 @@ import androidx.media3.common.MimeTypes;
|
|||||||
import androidx.media3.common.util.Assertions;
|
import androidx.media3.common.util.Assertions;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
import androidx.media3.effect.Presentation;
|
import androidx.media3.effect.Presentation;
|
||||||
|
import androidx.media3.transformer.AndroidTestUtil.AssetInfo;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
@ -60,13 +58,11 @@ import org.junit.runners.Parameterized.Parameters;
|
|||||||
@RunWith(Parameterized.class)
|
@RunWith(Parameterized.class)
|
||||||
public class ParameterizedInputSequenceExportTest {
|
public class ParameterizedInputSequenceExportTest {
|
||||||
private static final ImageItemConfig PNG_ITEM =
|
private static final ImageItemConfig PNG_ITEM =
|
||||||
new ImageItemConfig(PNG_ASSET_URI_STRING, /* frameCount= */ 34);
|
new ImageItemConfig(PNG_ASSET.uri, /* frameCount= */ 34);
|
||||||
private static final ImageItemConfig JPG_ITEM =
|
private static final ImageItemConfig JPG_ITEM =
|
||||||
new ImageItemConfig(JPG_ASSET_URI_STRING, /* frameCount= */ 41);
|
new ImageItemConfig(JPG_ASSET.uri, /* frameCount= */ 41);
|
||||||
private static final VideoItemConfig BT709_ITEM =
|
private static final VideoItemConfig BT709_ITEM = new VideoItemConfig(MP4_ASSET);
|
||||||
new VideoItemConfig(MP4_ASSET_URI_STRING, MP4_ASSET_FRAME_COUNT);
|
private static final VideoItemConfig BT601_ITEM = new VideoItemConfig(BT601_MP4_ASSET);
|
||||||
private static final VideoItemConfig BT601_ITEM =
|
|
||||||
new VideoItemConfig(BT601_MP4_ASSET_URI_STRING, BT601_MP4_ASSET_FRAME_COUNT);
|
|
||||||
|
|
||||||
@Parameters(name = "{0}")
|
@Parameters(name = "{0}")
|
||||||
public static ImmutableList<SequenceConfig> params() {
|
public static ImmutableList<SequenceConfig> params() {
|
||||||
@ -264,8 +260,8 @@ public class ParameterizedInputSequenceExportTest {
|
|||||||
* <p>Audio is removed and a {@link Presentation} of specified {@code height=360}.
|
* <p>Audio is removed and a {@link Presentation} of specified {@code height=360}.
|
||||||
*/
|
*/
|
||||||
private static final class VideoItemConfig extends ItemConfig {
|
private static final class VideoItemConfig extends ItemConfig {
|
||||||
public VideoItemConfig(String uri, int frameCount) {
|
public VideoItemConfig(AssetInfo asset) {
|
||||||
super(uri, frameCount, getFormatForTestFile(uri), getFormatForTestFile(uri));
|
super(asset.uri, asset.videoFrameCount, asset.videoFormat, asset.videoFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.createOpenGlObjects;
|
import static androidx.media3.transformer.AndroidTestUtil.createOpenGlObjects;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.generateTextureFromBitmap;
|
import static androidx.media3.transformer.AndroidTestUtil.generateTextureFromBitmap;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@ -108,8 +108,7 @@ public class RawAssetLoaderAndroidTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoTranscoding_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
public void videoTranscoding_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Bitmap bitmap =
|
Bitmap bitmap = new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET.uri)).get();
|
||||||
new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET_URI_STRING)).get();
|
|
||||||
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
||||||
new DefaultVideoFrameProcessor.Factory.Builder()
|
new DefaultVideoFrameProcessor.Factory.Builder()
|
||||||
.setGlObjectsProvider(new DefaultGlObjectsProvider(createOpenGlObjects()))
|
.setGlObjectsProvider(new DefaultGlObjectsProvider(createOpenGlObjects()))
|
||||||
@ -152,8 +151,7 @@ public class RawAssetLoaderAndroidTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoEditing_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
public void videoEditing_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Bitmap bitmap =
|
Bitmap bitmap = new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET.uri)).get();
|
||||||
new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET_URI_STRING)).get();
|
|
||||||
EGLContext currentContext = createOpenGlObjects();
|
EGLContext currentContext = createOpenGlObjects();
|
||||||
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
||||||
new DefaultVideoFrameProcessor.Factory.Builder()
|
new DefaultVideoFrameProcessor.Factory.Builder()
|
||||||
@ -199,8 +197,7 @@ public class RawAssetLoaderAndroidTest {
|
|||||||
@Test
|
@Test
|
||||||
public void audioAndVideoTranscoding_withRawData_completesWithCorrectFrameCountAndDuration()
|
public void audioAndVideoTranscoding_withRawData_completesWithCorrectFrameCountAndDuration()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Bitmap bitmap =
|
Bitmap bitmap = new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET.uri)).get();
|
||||||
new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET_URI_STRING)).get();
|
|
||||||
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
||||||
new DefaultVideoFrameProcessor.Factory.Builder()
|
new DefaultVideoFrameProcessor.Factory.Builder()
|
||||||
.setGlObjectsProvider(new DefaultGlObjectsProvider(createOpenGlObjects()))
|
.setGlObjectsProvider(new DefaultGlObjectsProvider(createOpenGlObjects()))
|
||||||
|
@ -18,19 +18,16 @@ package androidx.media3.transformer;
|
|||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.common.util.Util.isRunningOnEmulator;
|
import static androidx.media3.common.util.Util.isRunningOnEmulator;
|
||||||
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP3_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP3_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_SHORTER_AUDIO;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_180;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_SHORTER_AUDIO_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_270;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_180_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_270_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.createOpenGlObjects;
|
import static androidx.media3.transformer.AndroidTestUtil.createOpenGlObjects;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.generateTextureFromBitmap;
|
import static androidx.media3.transformer.AndroidTestUtil.generateTextureFromBitmap;
|
||||||
@ -133,16 +130,19 @@ public class TransformerEndToEndTest {
|
|||||||
public void compositionEditing_withThreeSequences_completes() throws Exception {
|
public void compositionEditing_withThreeSequences_completes() throws Exception {
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
EditedMediaItem audioVideoItem =
|
EditedMediaItem audioVideoItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
ImmutableList.of(createSonic(/* pitch= */ 2f)),
|
ImmutableList.of(createSonic(/* pitch= */ 2f)),
|
||||||
ImmutableList.of(RgbFilter.createInvertedFilter())))
|
ImmutableList.of(RgbFilter.createInvertedFilter())))
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem imageItem =
|
EditedMediaItem imageItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(JPG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(JPG_ASSET.uri))
|
||||||
.setDurationUs(1_500_000)
|
.setDurationUs(1_500_000)
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.build();
|
.build();
|
||||||
@ -151,7 +151,7 @@ public class TransformerEndToEndTest {
|
|||||||
new EditedMediaItemSequence(audioVideoItem, imageItem, audioVideoItem);
|
new EditedMediaItemSequence(audioVideoItem, imageItem, audioVideoItem);
|
||||||
|
|
||||||
EditedMediaItem.Builder audioBuilder =
|
EditedMediaItem.Builder audioBuilder =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING)).setRemoveVideo(true);
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri)).setRemoveVideo(true);
|
||||||
|
|
||||||
EditedMediaItemSequence audioSequence =
|
EditedMediaItemSequence audioSequence =
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
@ -200,9 +200,12 @@ public class TransformerEndToEndTest {
|
|||||||
public void compositionEditing_withLongLoopingSequence_completes() throws Exception {
|
public void compositionEditing_withLongLoopingSequence_completes() throws Exception {
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
EditedMediaItem imageItem =
|
EditedMediaItem imageItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(JPG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(JPG_ASSET.uri))
|
||||||
.setDurationUs(500_000)
|
.setDurationUs(500_000)
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.build();
|
.build();
|
||||||
@ -210,7 +213,7 @@ public class TransformerEndToEndTest {
|
|||||||
EditedMediaItemSequence imageSequence = new EditedMediaItemSequence(imageItem);
|
EditedMediaItemSequence imageSequence = new EditedMediaItemSequence(imageItem);
|
||||||
|
|
||||||
EditedMediaItem.Builder audioBuilder =
|
EditedMediaItem.Builder audioBuilder =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING)).setRemoveVideo(true);
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri)).setRemoveVideo(true);
|
||||||
|
|
||||||
EditedMediaItemSequence loopingAudioSequence =
|
EditedMediaItemSequence loopingAudioSequence =
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
@ -245,7 +248,7 @@ public class TransformerEndToEndTest {
|
|||||||
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
||||||
int expectedFrameCount = 40;
|
int expectedFrameCount = 40;
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET.uri))
|
||||||
.setDurationUs(C.MICROS_PER_SECOND)
|
.setDurationUs(C.MICROS_PER_SECOND)
|
||||||
.setFrameRate(expectedFrameCount)
|
.setFrameRate(expectedFrameCount)
|
||||||
.setEffects(effects)
|
.setEffects(effects)
|
||||||
@ -268,7 +271,7 @@ public class TransformerEndToEndTest {
|
|||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
int expectedFrameCount = 40;
|
int expectedFrameCount = 40;
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET.uri))
|
||||||
.setDurationUs(C.MICROS_PER_SECOND)
|
.setDurationUs(C.MICROS_PER_SECOND)
|
||||||
.setFrameRate(expectedFrameCount)
|
.setFrameRate(expectedFrameCount)
|
||||||
.build();
|
.build();
|
||||||
@ -287,8 +290,7 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoEditing_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
public void videoEditing_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Bitmap bitmap =
|
Bitmap bitmap = new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET.uri)).get();
|
||||||
new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET_URI_STRING)).get();
|
|
||||||
int expectedFrameCount = 2;
|
int expectedFrameCount = 2;
|
||||||
EGLContext currentContext = createOpenGlObjects();
|
EGLContext currentContext = createOpenGlObjects();
|
||||||
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
||||||
@ -342,8 +344,7 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoTranscoding_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
public void videoTranscoding_withTextureInput_completesWithCorrectFrameCountAndDuration()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Bitmap bitmap =
|
Bitmap bitmap = new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET.uri)).get();
|
||||||
new DataSourceBitmapLoader(context).loadBitmap(Uri.parse(PNG_ASSET_URI_STRING)).get();
|
|
||||||
int expectedFrameCount = 2;
|
int expectedFrameCount = 2;
|
||||||
EGLContext currentContext = createOpenGlObjects();
|
EGLContext currentContext = createOpenGlObjects();
|
||||||
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
||||||
@ -394,13 +395,16 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoEditing_completesWithConsistentFrameCount() throws Exception {
|
public void videoEditing_completesWithConsistentFrameCount() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setEncoderFactory(
|
.setEncoderFactory(
|
||||||
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET.uri));
|
||||||
ImmutableList<Effect> videoEffects = ImmutableList.of(Presentation.createForHeight(480));
|
ImmutableList<Effect> videoEffects = ImmutableList.of(Presentation.createForHeight(480));
|
||||||
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
@ -429,13 +433,13 @@ public class TransformerEndToEndTest {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
EditedMediaItem image1 =
|
EditedMediaItem image1 =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET.uri))
|
||||||
.setDurationUs(100_000)
|
.setDurationUs(100_000)
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.build();
|
.build();
|
||||||
int image1FrameCount = 3;
|
int image1FrameCount = 3;
|
||||||
EditedMediaItem image2 =
|
EditedMediaItem image2 =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(JPG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(JPG_ASSET.uri))
|
||||||
.setDurationUs(200_000)
|
.setDurationUs(200_000)
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.build();
|
.build();
|
||||||
@ -476,13 +480,16 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoEditing_effectsOverTime_completesWithConsistentFrameCount() throws Exception {
|
public void videoEditing_effectsOverTime_completesWithConsistentFrameCount() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setEncoderFactory(
|
.setEncoderFactory(
|
||||||
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET.uri));
|
||||||
ImmutableList<Effect> videoEffects =
|
ImmutableList<Effect> videoEffects =
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new TimestampWrapper(
|
new TimestampWrapper(
|
||||||
@ -512,13 +519,16 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoOnly_completesWithConsistentDuration() throws Exception {
|
public void videoOnly_completesWithConsistentDuration() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setEncoderFactory(
|
.setEncoderFactory(
|
||||||
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
new DefaultEncoderFactory.Builder(context).setEnableFallback(false).build())
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET.uri));
|
||||||
ImmutableList<Effect> videoEffects = ImmutableList.of(Presentation.createForHeight(480));
|
ImmutableList<Effect> videoEffects = ImmutableList.of(Presentation.createForHeight(480));
|
||||||
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
@ -539,14 +549,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
long clippingStartMs = 10_000;
|
long clippingStartMs = 10_000;
|
||||||
long clippingEndMs = 11_000;
|
long clippingEndMs = 11_000;
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(clippingStartMs)
|
.setStartPositionMs(clippingStartMs)
|
||||||
@ -570,14 +580,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
long clippingStartMs = 10_000;
|
long clippingStartMs = 10_000;
|
||||||
long clippingEndMs = 11_000;
|
long clippingEndMs = 11_000;
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(clippingStartMs)
|
.setStartPositionMs(clippingStartMs)
|
||||||
@ -609,8 +619,8 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
long clippingStartMs = 10_000;
|
long clippingStartMs = 10_000;
|
||||||
@ -619,7 +629,7 @@ public class TransformerEndToEndTest {
|
|||||||
// available to match the csd.
|
// available to match the csd.
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(clippingStartMs)
|
.setStartPositionMs(clippingStartMs)
|
||||||
@ -647,8 +657,8 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
long clippingStartMs = 10_000;
|
long clippingStartMs = 10_000;
|
||||||
@ -657,7 +667,7 @@ public class TransformerEndToEndTest {
|
|||||||
// fallback. This is because its csd doesn't match any known phone decoder.
|
// fallback. This is because its csd doesn't match any known phone decoder.
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(clippingStartMs)
|
.setStartPositionMs(clippingStartMs)
|
||||||
@ -693,15 +703,15 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
long clippingStartMs = 10_000;
|
long clippingStartMs = 10_000;
|
||||||
long clippingEndMs = 11_000;
|
long clippingEndMs = 11_000;
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(clippingStartMs)
|
.setStartPositionMs(clippingStartMs)
|
||||||
@ -729,14 +739,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
long clippingStartMs = 14_500;
|
long clippingStartMs = 14_500;
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
.setUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(clippingStartMs)
|
.setStartPositionMs(clippingStartMs)
|
||||||
@ -770,7 +780,7 @@ public class TransformerEndToEndTest {
|
|||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
@ -806,7 +816,7 @@ public class TransformerEndToEndTest {
|
|||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_270_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION_270.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
@ -843,7 +853,7 @@ public class TransformerEndToEndTest {
|
|||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_180_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION_180.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
@ -880,7 +890,7 @@ public class TransformerEndToEndTest {
|
|||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
@ -927,7 +937,7 @@ public class TransformerEndToEndTest {
|
|||||||
}
|
}
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
@ -973,7 +983,7 @@ public class TransformerEndToEndTest {
|
|||||||
/* videoEffects= */ ImmutableList.of(speedEffect.second));
|
/* videoEffects= */ ImmutableList.of(speedEffect.second));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
MediaItem.fromUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setEffects(effects)
|
.setEffects(effects)
|
||||||
.build();
|
.build();
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
@ -1010,7 +1020,7 @@ public class TransformerEndToEndTest {
|
|||||||
/* videoEffects= */ ImmutableList.of(speedEffect.second));
|
/* videoEffects= */ ImmutableList.of(speedEffect.second));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING))
|
MediaItem.fromUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri))
|
||||||
.setEffects(effects)
|
.setEffects(effects)
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.build();
|
.build();
|
||||||
@ -1033,13 +1043,16 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void videoEncoderFormatUnsupported_completesWithError() throws Exception {
|
public void videoEncoderFormatUnsupported_completesWithError() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setEncoderFactory(new VideoUnsupportedEncoderFactory(context))
|
.setEncoderFactory(new VideoUnsupportedEncoderFactory(context))
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri)))
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -1062,14 +1075,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
ImmutableList<Effect> videoEffects =
|
ImmutableList<Effect> videoEffects =
|
||||||
ImmutableList.of(new SpeedChangeEffect(1.5f), new SpeedChangeEffect(2f));
|
ImmutableList.of(new SpeedChangeEffect(1.5f), new SpeedChangeEffect(2f));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(
|
||||||
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)))
|
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri)))
|
||||||
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.build();
|
.build();
|
||||||
@ -1092,13 +1105,13 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
ImmutableList<Effect> videoEffects = ImmutableList.of(new SpeedChangeEffect(1.5f));
|
ImmutableList<Effect> videoEffects = ImmutableList.of(new SpeedChangeEffect(1.5f));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(
|
||||||
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)))
|
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri)))
|
||||||
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.build();
|
.build();
|
||||||
@ -1119,11 +1132,13 @@ public class TransformerEndToEndTest {
|
|||||||
public void audioVideoTranscodedFromDifferentSequences_producesExpectedResult() throws Exception {
|
public void audioVideoTranscodedFromDifferentSequences_producesExpectedResult() throws Exception {
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(createSonic(1.2f));
|
ImmutableList<AudioProcessor> audioProcessors = ImmutableList.of(createSonic(1.2f));
|
||||||
ImmutableList<Effect> videoEffects = ImmutableList.of(RgbFilter.createGrayscaleFilter());
|
ImmutableList<Effect> videoEffects = ImmutableList.of(RgbFilter.createGrayscaleFilter());
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS.uri));
|
||||||
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem)
|
new EditedMediaItem.Builder(mediaItem)
|
||||||
.setEffects(new Effects(audioProcessors, videoEffects))
|
.setEffects(new Effects(audioProcessors, videoEffects))
|
||||||
@ -1166,15 +1181,17 @@ public class TransformerEndToEndTest {
|
|||||||
public void loopingTranscodedAudio_producesExpectedResult() throws Exception {
|
public void loopingTranscodedAudio_producesExpectedResult() throws Exception {
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
EditedMediaItem audioEditedMediaItem =
|
EditedMediaItem audioEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET_URI_STRING)).build();
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET.uri)).build();
|
||||||
EditedMediaItemSequence loopingAudioSequence =
|
EditedMediaItemSequence loopingAudioSequence =
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
ImmutableList.of(audioEditedMediaItem, audioEditedMediaItem), /* isLooping= */ true);
|
ImmutableList.of(audioEditedMediaItem, audioEditedMediaItem), /* isLooping= */ true);
|
||||||
EditedMediaItem videoEditedMediaItem =
|
EditedMediaItem videoEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS.uri))
|
||||||
MediaItem.fromUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))
|
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItemSequence videoSequence =
|
EditedMediaItemSequence videoSequence =
|
||||||
@ -1206,16 +1223,17 @@ public class TransformerEndToEndTest {
|
|||||||
public void loopingTranscodedVideo_producesExpectedResult() throws Exception {
|
public void loopingTranscodedVideo_producesExpectedResult() throws Exception {
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
EditedMediaItem audioEditedMediaItem =
|
EditedMediaItem audioEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET_URI_STRING)).build();
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET.uri)).build();
|
||||||
EditedMediaItemSequence audioSequence =
|
EditedMediaItemSequence audioSequence =
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
audioEditedMediaItem, audioEditedMediaItem, audioEditedMediaItem);
|
audioEditedMediaItem, audioEditedMediaItem, audioEditedMediaItem);
|
||||||
EditedMediaItem videoEditedMediaItem =
|
EditedMediaItem videoEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri)).setRemoveAudio(true).build();
|
||||||
.setRemoveAudio(true)
|
|
||||||
.build();
|
|
||||||
EditedMediaItemSequence loopingVideoSequence =
|
EditedMediaItemSequence loopingVideoSequence =
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
ImmutableList.of(videoEditedMediaItem, videoEditedMediaItem), /* isLooping= */ true);
|
ImmutableList.of(videoEditedMediaItem, videoEditedMediaItem), /* isLooping= */ true);
|
||||||
@ -1244,12 +1262,12 @@ public class TransformerEndToEndTest {
|
|||||||
public void loopingImage_producesExpectedResult() throws Exception {
|
public void loopingImage_producesExpectedResult() throws Exception {
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
EditedMediaItem audioEditedMediaItem =
|
EditedMediaItem audioEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET_URI_STRING)).build();
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET.uri)).build();
|
||||||
EditedMediaItemSequence audioSequence =
|
EditedMediaItemSequence audioSequence =
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
audioEditedMediaItem, audioEditedMediaItem, audioEditedMediaItem);
|
audioEditedMediaItem, audioEditedMediaItem, audioEditedMediaItem);
|
||||||
EditedMediaItem imageEditedMediaItem =
|
EditedMediaItem imageEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET.uri))
|
||||||
.setDurationUs(1_000_000)
|
.setDurationUs(1_000_000)
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.build();
|
.build();
|
||||||
@ -1281,10 +1299,10 @@ public class TransformerEndToEndTest {
|
|||||||
public void loopingImage_loopingSequenceIsLongest_producesExpectedResult() throws Exception {
|
public void loopingImage_loopingSequenceIsLongest_producesExpectedResult() throws Exception {
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
EditedMediaItem audioEditedMediaItem =
|
EditedMediaItem audioEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET_URI_STRING)).build();
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP3_ASSET.uri)).build();
|
||||||
EditedMediaItemSequence audioSequence = new EditedMediaItemSequence(audioEditedMediaItem);
|
EditedMediaItemSequence audioSequence = new EditedMediaItemSequence(audioEditedMediaItem);
|
||||||
EditedMediaItem imageEditedMediaItem =
|
EditedMediaItem imageEditedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET.uri))
|
||||||
.setDurationUs(1_050_000)
|
.setDurationUs(1_050_000)
|
||||||
.setFrameRate(20)
|
.setFrameRate(20)
|
||||||
.build();
|
.build();
|
||||||
@ -1317,7 +1335,7 @@ public class TransformerEndToEndTest {
|
|||||||
|
|
||||||
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_URI_STRING)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri)))
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
ImmutableList.of(audioFormatTracker.createTeeAudioProcessor()),
|
ImmutableList.of(audioFormatTracker.createTeeAudioProcessor()),
|
||||||
@ -1341,7 +1359,7 @@ public class TransformerEndToEndTest {
|
|||||||
channelMixingAudioProcessor.putChannelMixingMatrix(
|
channelMixingAudioProcessor.putChannelMixingMatrix(
|
||||||
ChannelMixingMatrix.create(/* inputChannelCount= */ 1, /* outputChannelCount= */ 2));
|
ChannelMixingMatrix.create(/* inputChannelCount= */ 1, /* outputChannelCount= */ 2));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri)))
|
||||||
.setRemoveVideo(true)
|
.setRemoveVideo(true)
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
@ -1360,7 +1378,7 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void audioComposition_noEffects_transmuxes() throws Exception {
|
public void audioComposition_noEffects_transmuxes() throws Exception {
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri)))
|
||||||
.setRemoveVideo(true)
|
.setRemoveVideo(true)
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
@ -1378,7 +1396,7 @@ public class TransformerEndToEndTest {
|
|||||||
@Test
|
@Test
|
||||||
public void audioComposition_compositionEffects_transcodes() throws Exception {
|
public void audioComposition_compositionEffects_transcodes() throws Exception {
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri)))
|
||||||
.setRemoveVideo(true)
|
.setRemoveVideo(true)
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
@ -1401,14 +1419,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Transformer transformer = ExperimentalAnalyzerModeFactory.buildAnalyzer(context);
|
Transformer transformer = ExperimentalAnalyzerModeFactory.buildAnalyzer(context);
|
||||||
AtomicInteger audioBytesSeen = new AtomicInteger(/* initialValue= */ 0);
|
AtomicInteger audioBytesSeen = new AtomicInteger(/* initialValue= */ 0);
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(
|
||||||
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)))
|
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri)))
|
||||||
.setRemoveVideo(true)
|
.setRemoveVideo(true)
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
@ -1432,7 +1450,7 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Transformer transformer = ExperimentalAnalyzerModeFactory.buildAnalyzer(context);
|
Transformer transformer = ExperimentalAnalyzerModeFactory.buildAnalyzer(context);
|
||||||
AtomicInteger videoFramesSeen = new AtomicInteger(/* initialValue= */ 0);
|
AtomicInteger videoFramesSeen = new AtomicInteger(/* initialValue= */ 0);
|
||||||
@ -1441,7 +1459,7 @@ public class TransformerEndToEndTest {
|
|||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(
|
||||||
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)))
|
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri)))
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
@ -1465,7 +1483,7 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Transformer transformer = ExperimentalAnalyzerModeFactory.buildAnalyzer(context);
|
Transformer transformer = ExperimentalAnalyzerModeFactory.buildAnalyzer(context);
|
||||||
AtomicInteger audioBytesSeen = new AtomicInteger(/* initialValue= */ 0);
|
AtomicInteger audioBytesSeen = new AtomicInteger(/* initialValue= */ 0);
|
||||||
@ -1475,7 +1493,7 @@ public class TransformerEndToEndTest {
|
|||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(
|
||||||
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)))
|
Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri)))
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
ImmutableList.of(createByteCountingAudioProcessor(audioBytesSeen)),
|
ImmutableList.of(createByteCountingAudioProcessor(audioBytesSeen)),
|
||||||
@ -1500,13 +1518,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_FORMAT,
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_FORMAT
|
/* outputFormat= */ MP4_ASSET
|
||||||
|
.videoFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setSampleMimeType(MimeTypes.VIDEO_AV1)
|
.setSampleMimeType(MimeTypes.VIDEO_AV1)
|
||||||
.setCodecs(null)
|
.setCodecs(null)
|
||||||
.build());
|
.build());
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET.uri));
|
||||||
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
|
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context).setVideoMimeType(MimeTypes.VIDEO_AV1).build();
|
new Transformer.Builder(context).setVideoMimeType(MimeTypes.VIDEO_AV1).build();
|
||||||
@ -1527,7 +1546,7 @@ public class TransformerEndToEndTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void transcode_withOutputAudioMimeTypeAac_completesSuccessfully() throws Exception {
|
public void transcode_withOutputAudioMimeTypeAac_completesSuccessfully() throws Exception {
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP3_ASSET_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP3_ASSET.uri));
|
||||||
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
|
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context).setAudioMimeType(MimeTypes.AUDIO_AAC).build();
|
new Transformer.Builder(context).setAudioMimeType(MimeTypes.AUDIO_AAC).build();
|
||||||
@ -1660,14 +1679,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO.videoFormat);
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_SHORTER_AUDIO_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_SHORTER_AUDIO.uri));
|
||||||
|
|
||||||
ExportTestResult exportTestResult =
|
ExportTestResult exportTestResult =
|
||||||
new TransformerAndroidTestRunner.Builder(context, transformer)
|
new TransformerAndroidTestRunner.Builder(context, transformer)
|
||||||
@ -1702,14 +1721,14 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO.videoFormat);
|
||||||
assumeTrue(
|
assumeTrue(
|
||||||
"Old SDKs have large audio encoder buffer, and hits deadlocks due to b/329087277.",
|
"Old SDKs have large audio encoder buffer, and hits deadlocks due to b/329087277.",
|
||||||
Util.SDK_INT >= 31);
|
Util.SDK_INT >= 31);
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_SHORTER_AUDIO_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_SHORTER_AUDIO.uri));
|
||||||
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
|
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem).build();
|
||||||
|
|
||||||
Composition composition =
|
Composition composition =
|
||||||
@ -1748,8 +1767,8 @@ public class TransformerEndToEndTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_SHORTER_AUDIO.videoFormat);
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
SpeedProvider speedProvider =
|
SpeedProvider speedProvider =
|
||||||
TestSpeedProvider.createWithStartTimes(
|
TestSpeedProvider.createWithStartTimes(
|
||||||
@ -1761,7 +1780,7 @@ public class TransformerEndToEndTest {
|
|||||||
/* audioProcessors= */ ImmutableList.of(speedEffect.first),
|
/* audioProcessors= */ ImmutableList.of(speedEffect.first),
|
||||||
/* videoEffects= */ ImmutableList.of(speedEffect.second));
|
/* videoEffects= */ ImmutableList.of(speedEffect.second));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_WITH_SHORTER_AUDIO_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_WITH_SHORTER_AUDIO.uri))
|
||||||
.setEffects(effects)
|
.setEffects(effects)
|
||||||
.build();
|
.build();
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
|
@ -22,9 +22,8 @@ import static androidx.media3.test.utils.BitmapPixelTestUtil.MAXIMUM_AVERAGE_PIX
|
|||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.getBitmapAveragePixelAbsoluteDifferenceArgb8888;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.getBitmapAveragePixelAbsoluteDifferenceArgb8888;
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.maybeSaveTestBitmap;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.maybeSaveTestBitmap;
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
|
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@ -83,7 +82,10 @@ public final class TransformerMultiSequenceCompositionTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withTwoSequencesEachWithOneVideoMediaItem_succeeds() throws Exception {
|
public void export_withTwoSequencesEachWithOneVideoMediaItem_succeeds() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
|
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
@ -93,15 +95,14 @@ public final class TransformerMultiSequenceCompositionTest {
|
|||||||
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
||||||
/* firstSequenceMediaItems= */ ImmutableList.of(
|
/* firstSequenceMediaItems= */ ImmutableList.of(
|
||||||
editedMediaItemByClippingVideo(
|
editedMediaItemByClippingVideo(
|
||||||
MP4_ASSET_URI_STRING,
|
MP4_ASSET.uri,
|
||||||
/* effects= */ ImmutableList.of(
|
/* effects= */ ImmutableList.of(
|
||||||
new AlphaScale(0.5f),
|
new AlphaScale(0.5f),
|
||||||
new ScaleAndRotateTransformation.Builder()
|
new ScaleAndRotateTransformation.Builder()
|
||||||
.setRotationDegrees(180)
|
.setRotationDegrees(180)
|
||||||
.build()))),
|
.build()))),
|
||||||
/* secondSequenceMediaItems= */ ImmutableList.of(
|
/* secondSequenceMediaItems= */ ImmutableList.of(
|
||||||
editedMediaItemByClippingVideo(
|
editedMediaItemByClippingVideo(MP4_ASSET.uri, /* effects= */ ImmutableList.of())),
|
||||||
MP4_ASSET_URI_STRING, /* effects= */ ImmutableList.of())),
|
|
||||||
VideoCompositorSettings.DEFAULT);
|
VideoCompositorSettings.DEFAULT);
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
@ -117,7 +118,10 @@ public final class TransformerMultiSequenceCompositionTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withTwoSequencesOneWithVideoOneWithImage_succeeds() throws Exception {
|
public void export_withTwoSequencesOneWithVideoOneWithImage_succeeds() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
|
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
@ -127,15 +131,14 @@ public final class TransformerMultiSequenceCompositionTest {
|
|||||||
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
||||||
/* firstSequenceMediaItems= */ ImmutableList.of(
|
/* firstSequenceMediaItems= */ ImmutableList.of(
|
||||||
editedMediaItemByClippingVideo(
|
editedMediaItemByClippingVideo(
|
||||||
MP4_ASSET_URI_STRING,
|
MP4_ASSET.uri,
|
||||||
/* effects= */ ImmutableList.of(
|
/* effects= */ ImmutableList.of(
|
||||||
new AlphaScale(0.5f),
|
new AlphaScale(0.5f),
|
||||||
new ScaleAndRotateTransformation.Builder()
|
new ScaleAndRotateTransformation.Builder()
|
||||||
.setRotationDegrees(180)
|
.setRotationDegrees(180)
|
||||||
.build()))),
|
.build()))),
|
||||||
/* secondSequenceMediaItems= */ ImmutableList.of(
|
/* secondSequenceMediaItems= */ ImmutableList.of(
|
||||||
editedMediaItemOfOneFrameImage(
|
editedMediaItemOfOneFrameImage(JPG_ASSET.uri, /* effects= */ ImmutableList.of())),
|
||||||
JPG_ASSET_URI_STRING, /* effects= */ ImmutableList.of())),
|
|
||||||
VideoCompositorSettings.DEFAULT);
|
VideoCompositorSettings.DEFAULT);
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
@ -151,7 +154,10 @@ public final class TransformerMultiSequenceCompositionTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withTwoSequencesWithVideoCompositorSettings_succeeds() throws Exception {
|
public void export_withTwoSequencesWithVideoCompositorSettings_succeeds() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
|
|
||||||
VideoCompositorSettings pictureInPictureVideoCompositorSettings =
|
VideoCompositorSettings pictureInPictureVideoCompositorSettings =
|
||||||
new VideoCompositorSettings() {
|
new VideoCompositorSettings() {
|
||||||
@ -183,15 +189,14 @@ public final class TransformerMultiSequenceCompositionTest {
|
|||||||
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
||||||
/* firstSequenceMediaItems= */ ImmutableList.of(
|
/* firstSequenceMediaItems= */ ImmutableList.of(
|
||||||
editedMediaItemByClippingVideo(
|
editedMediaItemByClippingVideo(
|
||||||
MP4_ASSET_URI_STRING,
|
MP4_ASSET.uri,
|
||||||
/* effects= */ ImmutableList.of(
|
/* effects= */ ImmutableList.of(
|
||||||
new AlphaScale(0.5f),
|
new AlphaScale(0.5f),
|
||||||
new ScaleAndRotateTransformation.Builder()
|
new ScaleAndRotateTransformation.Builder()
|
||||||
.setRotationDegrees(180)
|
.setRotationDegrees(180)
|
||||||
.build()))),
|
.build()))),
|
||||||
/* secondSequenceMediaItems= */ ImmutableList.of(
|
/* secondSequenceMediaItems= */ ImmutableList.of(
|
||||||
editedMediaItemByClippingVideo(
|
editedMediaItemByClippingVideo(MP4_ASSET.uri, /* effects= */ ImmutableList.of())),
|
||||||
MP4_ASSET_URI_STRING, /* effects= */ ImmutableList.of())),
|
|
||||||
pictureInPictureVideoCompositorSettings);
|
pictureInPictureVideoCompositorSettings);
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
|
@ -15,8 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@ -80,8 +79,8 @@ public class TransformerPauseResumeTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
buildSingleSequenceComposition(
|
buildSingleSequenceComposition(
|
||||||
/* clippingStartPositionMs= */ 0,
|
/* clippingStartPositionMs= */ 0,
|
||||||
@ -132,8 +131,8 @@ public class TransformerPauseResumeTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
buildSingleSequenceComposition(
|
buildSingleSequenceComposition(
|
||||||
/* clippingStartPositionMs= */ 0,
|
/* clippingStartPositionMs= */ 0,
|
||||||
@ -167,8 +166,8 @@ public class TransformerPauseResumeTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
buildSingleSequenceComposition(
|
buildSingleSequenceComposition(
|
||||||
/* clippingStartPositionMs= */ 0,
|
/* clippingStartPositionMs= */ 0,
|
||||||
@ -222,8 +221,8 @@ public class TransformerPauseResumeTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
buildSingleSequenceComposition(
|
buildSingleSequenceComposition(
|
||||||
/* clippingStartPositionMs= */ 2_000L,
|
/* clippingStartPositionMs= */ 2_000L,
|
||||||
@ -274,8 +273,8 @@ public class TransformerPauseResumeTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
buildSingleSequenceComposition(
|
buildSingleSequenceComposition(
|
||||||
/* clippingStartPositionMs= */ 0,
|
/* clippingStartPositionMs= */ 0,
|
||||||
@ -329,8 +328,8 @@ public class TransformerPauseResumeTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
buildSingleSequenceComposition(
|
buildSingleSequenceComposition(
|
||||||
/* clippingStartPositionMs= */ 0,
|
/* clippingStartPositionMs= */ 0,
|
||||||
@ -385,7 +384,7 @@ public class TransformerPauseResumeTest {
|
|||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING)
|
.setUri(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(clippingStartPositionMs)
|
.setStartPositionMs(clippingStartPositionMs)
|
||||||
|
@ -17,7 +17,7 @@ package androidx.media3.transformer;
|
|||||||
|
|
||||||
import static androidx.media3.common.util.Assertions.checkStateNotNull;
|
import static androidx.media3.common.util.Assertions.checkStateNotNull;
|
||||||
import static androidx.media3.common.util.Util.isRunningOnEmulator;
|
import static androidx.media3.common.util.Util.isRunningOnEmulator;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION;
|
||||||
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_AVAILABLE;
|
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_AVAILABLE;
|
||||||
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_NOT_STARTED;
|
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_NOT_STARTED;
|
||||||
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_UNAVAILABLE;
|
import static androidx.media3.transformer.Transformer.PROGRESS_STATE_UNAVAILABLE;
|
||||||
@ -115,7 +115,7 @@ public class TransformerProgressTest {
|
|||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(AndroidTestUtil.MP4_ASSET_URI_STRING))
|
MediaItem.fromUri(AndroidTestUtil.MP4_ASSET.uri))
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
/* audioProcessors= */ ImmutableList.of(),
|
/* audioProcessors= */ ImmutableList.of(),
|
||||||
@ -173,7 +173,7 @@ public class TransformerProgressTest {
|
|||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
@ -253,7 +253,7 @@ public class TransformerProgressTest {
|
|||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
|
@ -21,21 +21,16 @@ import static androidx.media3.common.util.Assertions.checkNotNull;
|
|||||||
import static androidx.media3.common.util.Util.SDK_INT;
|
import static androidx.media3.common.util.Util.SDK_INT;
|
||||||
import static androidx.media3.effect.DebugTraceUtil.EVENT_SURFACE_TEXTURE_TRANSFORM_FIX;
|
import static androidx.media3.effect.DebugTraceUtil.EVENT_SURFACE_TEXTURE_TRANSFORM_FIX;
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.BT601_MOV_ASSET_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.BT601_MOV_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.BT601_MOV_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_PORTRAIT_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_PORTRAIT_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_VIDEO_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_VIDEO;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_VIDEO_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_CHECKERBOARD_VIDEO;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_CHECKERBOARD_VIDEO_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_CHECKERBOARD_VIDEO_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_PORTRAIT_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET_LINES_1080P;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_PORTRAIT_ASSET_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_PORTRAIT_ASSET_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.PNG_ASSET_LINES_1080P_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
|
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
|
||||||
import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT;
|
import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT;
|
||||||
@ -112,26 +107,29 @@ public final class TransformerSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withNoCompositionPresentationAndWithPerMediaItemEffects() throws Exception {
|
public void export_withNoCompositionPresentationAndWithPerMediaItemEffects() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
OverlayEffect overlayEffect = createOverlayEffect();
|
OverlayEffect overlayEffect = createOverlayEffect();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_URI_STRING,
|
MP4_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
Presentation.createForWidthAndHeight(
|
Presentation.createForWidthAndHeight(
|
||||||
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT)),
|
||||||
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
oneFrameFromImage(
|
oneFrameFromImage(
|
||||||
JPG_ASSET_URI_STRING,
|
JPG_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(72).build(),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(72).build(),
|
||||||
overlayEffect)),
|
overlayEffect)),
|
||||||
oneFrameFromImage(JPG_ASSET_URI_STRING, NO_EFFECT),
|
oneFrameFromImage(JPG_ASSET.uri, NO_EFFECT),
|
||||||
// Transition to a different aspect ratio.
|
// Transition to a different aspect ratio.
|
||||||
oneFrameFromImage(
|
oneFrameFromImage(
|
||||||
JPG_ASSET_URI_STRING,
|
JPG_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
Presentation.createForWidthAndHeight(
|
Presentation.createForWidthAndHeight(
|
||||||
EXPORT_WIDTH / 2, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT),
|
EXPORT_WIDTH / 2, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT),
|
||||||
@ -151,17 +149,19 @@ public final class TransformerSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export1080x720_withAllAvailableDecoders_doesNotStretchOutputOnAny() throws Exception {
|
public void export1080x720_withAllAvailableDecoders_doesNotStretchOutputOnAny() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
List<MediaCodecInfo> mediaCodecInfoList =
|
List<MediaCodecInfo> mediaCodecInfoList =
|
||||||
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
||||||
checkNotNull(MP4_ASSET_FORMAT.sampleMimeType),
|
checkNotNull(MP4_ASSET.videoFormat.sampleMimeType),
|
||||||
/* requiresSecureDecoder= */ false,
|
/* requiresSecureDecoder= */ false,
|
||||||
/* requiresTunnelingDecoder= */ false);
|
/* requiresTunnelingDecoder= */ false);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(
|
clippedVideo(MP4_ASSET.uri, NO_EFFECT, /* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
||||||
MP4_ASSET_URI_STRING, NO_EFFECT, /* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
|
||||||
|
|
||||||
boolean atLeastOneDecoderSucceeds = false;
|
boolean atLeastOneDecoderSucceeds = false;
|
||||||
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
||||||
@ -188,20 +188,18 @@ public final class TransformerSequenceEffectTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_PORTRAIT_ASSET_FORMAT,
|
/* inputFormat= */ MP4_PORTRAIT_ASSET.videoFormat,
|
||||||
/* outputFormat= */ MP4_PORTRAIT_ASSET_FORMAT);
|
/* outputFormat= */ MP4_PORTRAIT_ASSET.videoFormat);
|
||||||
List<MediaCodecInfo> mediaCodecInfoList =
|
List<MediaCodecInfo> mediaCodecInfoList =
|
||||||
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
||||||
checkNotNull(MP4_PORTRAIT_ASSET_FORMAT.sampleMimeType),
|
checkNotNull(MP4_PORTRAIT_ASSET.videoFormat.sampleMimeType),
|
||||||
/* requiresSecureDecoder= */ false,
|
/* requiresSecureDecoder= */ false,
|
||||||
/* requiresTunnelingDecoder= */ false);
|
/* requiresTunnelingDecoder= */ false);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_PORTRAIT_ASSET_URI_STRING,
|
MP4_PORTRAIT_ASSET.uri, NO_EFFECT, /* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
||||||
NO_EFFECT,
|
|
||||||
/* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
|
||||||
|
|
||||||
boolean atLeastOneDecoderSucceeds = false;
|
boolean atLeastOneDecoderSucceeds = false;
|
||||||
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
||||||
@ -228,20 +226,18 @@ public final class TransformerSequenceEffectTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ BT601_MOV_ASSET_FORMAT,
|
/* inputFormat= */ BT601_MOV_ASSET.videoFormat,
|
||||||
/* outputFormat= */ BT601_MOV_ASSET_FORMAT);
|
/* outputFormat= */ BT601_MOV_ASSET.videoFormat);
|
||||||
List<MediaCodecInfo> mediaCodecInfoList =
|
List<MediaCodecInfo> mediaCodecInfoList =
|
||||||
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
||||||
checkNotNull(BT601_MOV_ASSET_FORMAT.sampleMimeType),
|
checkNotNull(BT601_MOV_ASSET.videoFormat.sampleMimeType),
|
||||||
/* requiresSecureDecoder= */ false,
|
/* requiresSecureDecoder= */ false,
|
||||||
/* requiresTunnelingDecoder= */ false);
|
/* requiresTunnelingDecoder= */ false);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
BT601_MOV_ASSET_URI_STRING,
|
BT601_MOV_ASSET.uri, NO_EFFECT, /* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
||||||
NO_EFFECT,
|
|
||||||
/* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
|
||||||
|
|
||||||
boolean atLeastOneDecoderSucceeds = false;
|
boolean atLeastOneDecoderSucceeds = false;
|
||||||
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
||||||
@ -269,20 +265,18 @@ public final class TransformerSequenceEffectTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_AV1_VIDEO_FORMAT,
|
/* inputFormat= */ MP4_ASSET_AV1_VIDEO.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_AV1_VIDEO_FORMAT);
|
/* outputFormat= */ MP4_ASSET_AV1_VIDEO.videoFormat);
|
||||||
List<MediaCodecInfo> mediaCodecInfoList =
|
List<MediaCodecInfo> mediaCodecInfoList =
|
||||||
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
||||||
checkNotNull(MP4_ASSET_AV1_VIDEO_FORMAT.sampleMimeType),
|
checkNotNull(MP4_ASSET_AV1_VIDEO.videoFormat.sampleMimeType),
|
||||||
/* requiresSecureDecoder= */ false,
|
/* requiresSecureDecoder= */ false,
|
||||||
/* requiresTunnelingDecoder= */ false);
|
/* requiresTunnelingDecoder= */ false);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_AV1_VIDEO_URI_STRING,
|
MP4_ASSET_AV1_VIDEO.uri, NO_EFFECT, /* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
||||||
NO_EFFECT,
|
|
||||||
/* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
|
||||||
|
|
||||||
boolean atLeastOneDecoderSucceeds = false;
|
boolean atLeastOneDecoderSucceeds = false;
|
||||||
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
||||||
@ -309,11 +303,11 @@ public final class TransformerSequenceEffectTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_CHECKERBOARD_VIDEO_FORMAT,
|
/* inputFormat= */ MP4_ASSET_CHECKERBOARD_VIDEO.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFormat);
|
||||||
List<MediaCodecInfo> mediaCodecInfoList =
|
List<MediaCodecInfo> mediaCodecInfoList =
|
||||||
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
||||||
checkNotNull(MP4_ASSET_CHECKERBOARD_VIDEO_FORMAT.sampleMimeType),
|
checkNotNull(MP4_ASSET_CHECKERBOARD_VIDEO.videoFormat.sampleMimeType),
|
||||||
/* requiresSecureDecoder= */ false,
|
/* requiresSecureDecoder= */ false,
|
||||||
/* requiresTunnelingDecoder= */ false);
|
/* requiresTunnelingDecoder= */ false);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
@ -321,7 +315,7 @@ public final class TransformerSequenceEffectTest {
|
|||||||
Presentation.createForWidthAndHeight(
|
Presentation.createForWidthAndHeight(
|
||||||
/* width= */ 320, /* height= */ 240, Presentation.LAYOUT_SCALE_TO_FIT),
|
/* width= */ 320, /* height= */ 240, Presentation.LAYOUT_SCALE_TO_FIT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_CHECKERBOARD_VIDEO_URI_STRING,
|
MP4_ASSET_CHECKERBOARD_VIDEO.uri,
|
||||||
NO_EFFECT,
|
NO_EFFECT,
|
||||||
/* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
/* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
||||||
DebugTraceUtil.enableTracing = true;
|
DebugTraceUtil.enableTracing = true;
|
||||||
@ -354,12 +348,12 @@ public final class TransformerSequenceEffectTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT);
|
/* outputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_LINES_1080P_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_LINES_1080P.uri))
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.setDurationUs(C.MICROS_PER_SECOND / 4)
|
.setDurationUs(C.MICROS_PER_SECOND / 4)
|
||||||
.build());
|
.build());
|
||||||
@ -410,7 +404,8 @@ public final class TransformerSequenceEffectTest {
|
|||||||
int exportWidth = 640;
|
int exportWidth = 640;
|
||||||
int exportHeight = 240;
|
int exportHeight = 240;
|
||||||
Format outputFormat =
|
Format outputFormat =
|
||||||
MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT
|
MP4_ASSET_WITH_INCREASING_TIMESTAMPS
|
||||||
|
.videoFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setWidth(exportWidth)
|
.setWidth(exportWidth)
|
||||||
.setHeight(exportHeight)
|
.setHeight(exportHeight)
|
||||||
@ -418,12 +413,12 @@ public final class TransformerSequenceEffectTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
outputFormat);
|
outputFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_LINES_1080P_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(PNG_ASSET_LINES_1080P.uri))
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.setDurationUs(C.MICROS_PER_SECOND / 4)
|
.setDurationUs(C.MICROS_PER_SECOND / 4)
|
||||||
.setEffects(
|
.setEffects(
|
||||||
@ -472,24 +467,27 @@ public final class TransformerSequenceEffectTest {
|
|||||||
|| Ascii.equalsIgnoreCase(Util.MODEL, "vivo 1820")));
|
|| Ascii.equalsIgnoreCase(Util.MODEL, "vivo 1820")));
|
||||||
|
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForWidthAndHeight(
|
Presentation.createForWidthAndHeight(
|
||||||
EXPORT_WIDTH, /* height= */ EXPORT_WIDTH, Presentation.LAYOUT_SCALE_TO_FIT),
|
EXPORT_WIDTH, /* height= */ EXPORT_WIDTH, Presentation.LAYOUT_SCALE_TO_FIT),
|
||||||
oneFrameFromImage(
|
oneFrameFromImage(
|
||||||
JPG_ASSET_URI_STRING,
|
JPG_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(90).build(),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(90).build(),
|
||||||
Presentation.createForWidthAndHeight(
|
Presentation.createForWidthAndHeight(
|
||||||
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT))),
|
EXPORT_WIDTH, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT))),
|
||||||
oneFrameFromImage(JPG_ASSET_URI_STRING, NO_EFFECT),
|
oneFrameFromImage(JPG_ASSET.uri, NO_EFFECT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_URI_STRING,
|
MP4_ASSET.uri,
|
||||||
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
||||||
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_URI_STRING,
|
MP4_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
Presentation.createForWidthAndHeight(
|
Presentation.createForWidthAndHeight(
|
||||||
EXPORT_WIDTH / 2, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT),
|
EXPORT_WIDTH / 2, EXPORT_HEIGHT, Presentation.LAYOUT_SCALE_TO_FIT),
|
||||||
@ -509,15 +507,17 @@ public final class TransformerSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withCompositionPresentationAndNoVideoEffects() throws Exception {
|
public void export_withCompositionPresentationAndNoVideoEffects() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
oneFrameFromImage(JPG_ASSET_URI_STRING, NO_EFFECT),
|
oneFrameFromImage(JPG_ASSET.uri, NO_EFFECT),
|
||||||
clippedVideo(
|
clippedVideo(MP4_PORTRAIT_ASSET.uri, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
MP4_PORTRAIT_ASSET_URI_STRING, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
clippedVideo(MP4_ASSET.uri, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(MP4_ASSET_URI_STRING, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
oneFrameFromImage(JPG_PORTRAIT_ASSET.uri, NO_EFFECT));
|
||||||
oneFrameFromImage(JPG_PORTRAIT_ASSET_URI_STRING, NO_EFFECT));
|
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, getLinearColorSpaceTransformer())
|
new TransformerAndroidTestRunner.Builder(context, getLinearColorSpaceTransformer())
|
||||||
@ -533,13 +533,16 @@ public final class TransformerSequenceEffectTest {
|
|||||||
public void export_withCompositionPresentationAndNoVideoEffectsForFirstMediaItem()
|
public void export_withCompositionPresentationAndNoVideoEffectsForFirstMediaItem()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(MP4_ASSET_URI_STRING, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
clippedVideo(MP4_ASSET.uri, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_PORTRAIT_ASSET_URI_STRING,
|
MP4_PORTRAIT_ASSET.uri,
|
||||||
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
||||||
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
||||||
|
|
||||||
@ -556,17 +559,20 @@ public final class TransformerSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withBt601AndBt709MediaItems() throws Exception {
|
public void export_withBt601AndBt709MediaItems() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ BT601_MOV_ASSET_FORMAT, /* outputFormat= */ null);
|
context, testId, /* inputFormat= */ BT601_MOV_ASSET.videoFormat, /* outputFormat= */ null);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
BT601_MOV_ASSET_URI_STRING,
|
BT601_MOV_ASSET.uri,
|
||||||
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
||||||
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(MP4_ASSET_URI_STRING, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
clippedVideo(MP4_ASSET.uri, NO_EFFECT, SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, getLinearColorSpaceTransformer())
|
new TransformerAndroidTestRunner.Builder(context, getLinearColorSpaceTransformer())
|
||||||
@ -581,17 +587,20 @@ public final class TransformerSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withBt601VideoAndBt709ImageMediaItems() throws Exception {
|
public void export_withBt601VideoAndBt709ImageMediaItems() throws Exception {
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ BT601_MOV_ASSET_FORMAT, /* outputFormat= */ null);
|
context, testId, /* inputFormat= */ BT601_MOV_ASSET.videoFormat, /* outputFormat= */ null);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
BT601_MOV_ASSET_URI_STRING,
|
BT601_MOV_ASSET.uri,
|
||||||
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
ImmutableList.of(RgbFilter.createInvertedFilter()),
|
||||||
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
oneFrameFromImage(JPG_ASSET_URI_STRING, NO_EFFECT));
|
oneFrameFromImage(JPG_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, getLinearColorSpaceTransformer())
|
new TransformerAndroidTestRunner.Builder(context, getLinearColorSpaceTransformer())
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.ULTRA_HDR_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ULTRA_HDR_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assertSdrColors;
|
import static androidx.media3.transformer.AndroidTestUtil.assertSdrColors;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
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;
|
||||||
@ -85,7 +85,7 @@ public final class TransformerUltraHdrTest {
|
|||||||
/* outputFormat= */ DOWNSCALED_ULTRA_HDR_FORMAT);
|
/* outputFormat= */ DOWNSCALED_ULTRA_HDR_FORMAT);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ false, oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT));
|
/* tonemap= */ false, oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
// Downscale source bitmap to avoid "video encoding format not supported" errors on emulators.
|
// Downscale source bitmap to avoid "video encoding format not supported" errors on emulators.
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
@ -105,7 +105,7 @@ public final class TransformerUltraHdrTest {
|
|||||||
/* outputFormat= */ DOWNSCALED_ULTRA_HDR_FORMAT);
|
/* outputFormat= */ DOWNSCALED_ULTRA_HDR_FORMAT);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ true, oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT));
|
/* tonemap= */ true, oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
// Downscale source bitmap to avoid "video encoding format not supported" errors on emulators.
|
// Downscale source bitmap to avoid "video encoding format not supported" errors on emulators.
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
@ -125,7 +125,7 @@ public final class TransformerUltraHdrTest {
|
|||||||
/* outputFormat= */ DOWNSCALED_ULTRA_HDR_FORMAT);
|
/* outputFormat= */ DOWNSCALED_ULTRA_HDR_FORMAT);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT)))
|
new EditedMediaItemSequence(oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// Downscale source bitmap to avoid "video encoding format not supported" errors on emulators.
|
// Downscale source bitmap to avoid "video encoding format not supported" errors on emulators.
|
||||||
@ -141,7 +141,7 @@ public final class TransformerUltraHdrTest {
|
|||||||
public void exportNonUltraHdrImage_withUltraHdrEnabled_exportsSdr() throws Exception {
|
public void exportNonUltraHdrImage_withUltraHdrEnabled_exportsSdr() throws Exception {
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ false, oneFrameFromImage(JPG_ASSET_URI_STRING, NO_EFFECT));
|
/* tonemap= */ false, oneFrameFromImage(JPG_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
||||||
@ -156,8 +156,8 @@ public final class TransformerUltraHdrTest {
|
|||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ false,
|
/* tonemap= */ false,
|
||||||
oneFrameFromImage(JPG_ASSET_URI_STRING, NO_EFFECT),
|
oneFrameFromImage(JPG_ASSET.uri, NO_EFFECT),
|
||||||
oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT));
|
oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
package androidx.media3.transformer;
|
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;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.junit.Assume.assumeTrue;
|
import static org.junit.Assume.assumeTrue;
|
||||||
@ -61,7 +61,10 @@ public class TransformerWithInAppMuxerEndToEndAndroidTest {
|
|||||||
// signal a lack of support for H265_MP4's actual format, but pass this test when using
|
// signal a lack of support for H265_MP4's actual format, but pass this test when using
|
||||||
// MP4_ASSET_FORMAT for skipping.
|
// MP4_ASSET_FORMAT for skipping.
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_FORMAT, /* outputFormat= */ MP4_ASSET_FORMAT);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
|
/* outputFormat= */ MP4_ASSET.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setMuxerFactory(new InAppMuxer.Factory.Builder().build())
|
.setMuxerFactory(new InAppMuxer.Factory.Builder().build())
|
||||||
|
@ -17,9 +17,8 @@
|
|||||||
package androidx.media3.transformer;
|
package androidx.media3.transformer;
|
||||||
|
|
||||||
import static androidx.media3.common.util.Util.usToMs;
|
import static androidx.media3.common.util.Util.usToMs;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.JPG_SINGLE_PIXEL_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_SINGLE_PIXEL_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DURATION_US;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.app.Instrumentation;
|
import android.app.Instrumentation;
|
||||||
@ -89,7 +88,7 @@ public class VideoTimestampConsistencyTest {
|
|||||||
EditedMediaItem image =
|
EditedMediaItem image =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(usToMs(imageDurationUs))
|
.setImageDurationMs(usToMs(imageDurationUs))
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(imageDurationUs)
|
.setDurationUs(imageDurationUs)
|
||||||
@ -102,8 +101,8 @@ public class VideoTimestampConsistencyTest {
|
|||||||
@Test
|
@Test
|
||||||
public void oneVideoComposition_timestampsAreConsistent() throws Exception {
|
public void oneVideoComposition_timestampsAreConsistent() throws Exception {
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
compareTimestamps(ImmutableList.of(video), MP4_ASSET_FRAME_TIMESTAMPS_US);
|
compareTimestamps(ImmutableList.of(video), MP4_ASSET_FRAME_TIMESTAMPS_US);
|
||||||
@ -115,19 +114,19 @@ public class VideoTimestampConsistencyTest {
|
|||||||
long clippedStartUs = 500_000L;
|
long clippedStartUs = 500_000L;
|
||||||
EditedMediaItem video1 =
|
EditedMediaItem video1 =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(MP4_ASSET_URI_STRING)
|
MediaItem.fromUri(MP4_ASSET.uri)
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(usToMs(clippedStartUs))
|
.setStartPositionMs(usToMs(clippedStartUs))
|
||||||
.build())
|
.build())
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
EditedMediaItem video2 =
|
EditedMediaItem video2 =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> expectedTimestamps =
|
ImmutableList<Long> expectedTimestamps =
|
||||||
@ -136,7 +135,7 @@ public class VideoTimestampConsistencyTest {
|
|||||||
.addAll(
|
.addAll(
|
||||||
Lists.transform(
|
Lists.transform(
|
||||||
MP4_ASSET_FRAME_TIMESTAMPS_US,
|
MP4_ASSET_FRAME_TIMESTAMPS_US,
|
||||||
timestampUs -> ((MP4_ASSET_DURATION_US - clippedStartUs) + timestampUs)))
|
timestampUs -> ((MP4_ASSET.videoDurationUs - clippedStartUs) + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
compareTimestamps(ImmutableList.of(video1, video2), expectedTimestamps);
|
compareTimestamps(ImmutableList.of(video1, video2), expectedTimestamps);
|
||||||
@ -145,13 +144,13 @@ public class VideoTimestampConsistencyTest {
|
|||||||
@Test
|
@Test
|
||||||
public void twoVideosComposition_timestampsAreConsistent() throws Exception {
|
public void twoVideosComposition_timestampsAreConsistent() throws Exception {
|
||||||
EditedMediaItem video1 =
|
EditedMediaItem video1 =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
EditedMediaItem video2 =
|
EditedMediaItem video2 =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> expectedTimestamps =
|
ImmutableList<Long> expectedTimestamps =
|
||||||
@ -160,7 +159,7 @@ public class VideoTimestampConsistencyTest {
|
|||||||
.addAll(
|
.addAll(
|
||||||
Lists.transform(
|
Lists.transform(
|
||||||
MP4_ASSET_FRAME_TIMESTAMPS_US,
|
MP4_ASSET_FRAME_TIMESTAMPS_US,
|
||||||
timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
compareTimestamps(ImmutableList.of(video1, video2), expectedTimestamps);
|
compareTimestamps(ImmutableList.of(video1, video2), expectedTimestamps);
|
||||||
@ -173,7 +172,7 @@ public class VideoTimestampConsistencyTest {
|
|||||||
EditedMediaItem image1 =
|
EditedMediaItem image1 =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(usToMs(imageDurationUs))
|
.setImageDurationMs(usToMs(imageDurationUs))
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(imageDurationUs)
|
.setDurationUs(imageDurationUs)
|
||||||
@ -182,7 +181,7 @@ public class VideoTimestampConsistencyTest {
|
|||||||
EditedMediaItem image2 =
|
EditedMediaItem image2 =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(usToMs(imageDurationUs))
|
.setImageDurationMs(usToMs(imageDurationUs))
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(imageDurationUs)
|
.setDurationUs(imageDurationUs)
|
||||||
@ -209,15 +208,15 @@ public class VideoTimestampConsistencyTest {
|
|||||||
EditedMediaItem image =
|
EditedMediaItem image =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(usToMs(imageDurationUs))
|
.setImageDurationMs(usToMs(imageDurationUs))
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(imageDurationUs)
|
.setDurationUs(imageDurationUs)
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> expectedTimestamps =
|
ImmutableList<Long> expectedTimestamps =
|
||||||
@ -236,13 +235,13 @@ public class VideoTimestampConsistencyTest {
|
|||||||
long imageDurationUs = 500_000L;
|
long imageDurationUs = 500_000L;
|
||||||
|
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem image =
|
EditedMediaItem image =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(usToMs(imageDurationUs))
|
.setImageDurationMs(usToMs(imageDurationUs))
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(imageDurationUs)
|
.setDurationUs(imageDurationUs)
|
||||||
@ -255,7 +254,7 @@ public class VideoTimestampConsistencyTest {
|
|||||||
.addAll(
|
.addAll(
|
||||||
Lists.transform(
|
Lists.transform(
|
||||||
IMAGE_TIMESTAMPS_US_500_MS_30_FPS,
|
IMAGE_TIMESTAMPS_US_500_MS_30_FPS,
|
||||||
timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
compareTimestamps(ImmutableList.of(video, image), expectedTimestamps);
|
compareTimestamps(ImmutableList.of(video, image), expectedTimestamps);
|
||||||
@ -268,19 +267,19 @@ public class VideoTimestampConsistencyTest {
|
|||||||
|
|
||||||
EditedMediaItem video =
|
EditedMediaItem video =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
MediaItem.fromUri(MP4_ASSET_URI_STRING)
|
MediaItem.fromUri(MP4_ASSET.uri)
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(usToMs(clippedStartUs))
|
.setStartPositionMs(usToMs(clippedStartUs))
|
||||||
.build())
|
.build())
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem image =
|
EditedMediaItem image =
|
||||||
new EditedMediaItem.Builder(
|
new EditedMediaItem.Builder(
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(JPG_SINGLE_PIXEL_URI_STRING)
|
.setUri(JPG_SINGLE_PIXEL_ASSET.uri)
|
||||||
.setImageDurationMs(usToMs(imageDurationUs))
|
.setImageDurationMs(usToMs(imageDurationUs))
|
||||||
.build())
|
.build())
|
||||||
.setDurationUs(imageDurationUs)
|
.setDurationUs(imageDurationUs)
|
||||||
@ -293,7 +292,7 @@ public class VideoTimestampConsistencyTest {
|
|||||||
.addAll(
|
.addAll(
|
||||||
Lists.transform(
|
Lists.transform(
|
||||||
IMAGE_TIMESTAMPS_US_500_MS_30_FPS,
|
IMAGE_TIMESTAMPS_US_500_MS_30_FPS,
|
||||||
timestampUs -> ((MP4_ASSET_DURATION_US - clippedStartUs) + timestampUs)))
|
timestampUs -> ((MP4_ASSET.videoDurationUs - clippedStartUs) + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
compareTimestamps(ImmutableList.of(video, image), expectedTimestamps);
|
compareTimestamps(ImmutableList.of(video, image), expectedTimestamps);
|
||||||
|
@ -23,9 +23,9 @@ import static androidx.media3.test.utils.BitmapPixelTestUtil.getBitmapAveragePix
|
|||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
||||||
import static androidx.media3.test.utils.TestUtil.assertBitmapsAreSimilar;
|
import static androidx.media3.test.utils.TestUtil.assertBitmapsAreSimilar;
|
||||||
import static androidx.media3.test.utils.VideoFrameProcessorTestRunner.VIDEO_FRAME_PROCESSING_WAIT_MS;
|
import static androidx.media3.test.utils.VideoFrameProcessorTestRunner.VIDEO_FRAME_PROCESSING_WAIT_MS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
||||||
import static androidx.media3.transformer.SequenceEffectTestUtil.PSNR_THRESHOLD;
|
import static androidx.media3.transformer.SequenceEffectTestUtil.PSNR_THRESHOLD;
|
||||||
@ -152,7 +152,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_FORMAT,
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
videoFrameProcessorTestRunner = getDefaultFrameProcessorTestRunnerBuilder(testId).build();
|
videoFrameProcessorTestRunner = getDefaultFrameProcessorTestRunnerBuilder(testId).build();
|
||||||
Bitmap expectedBitmap = readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
||||||
@ -172,7 +172,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_FORMAT,
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
TextureBitmapReader consumersBitmapReader = new TextureBitmapReader();
|
TextureBitmapReader consumersBitmapReader = new TextureBitmapReader();
|
||||||
VideoFrameProcessorTestRunner texIdProducingVideoFrameProcessorTestRunner =
|
VideoFrameProcessorTestRunner texIdProducingVideoFrameProcessorTestRunner =
|
||||||
@ -200,7 +200,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_FORMAT,
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
videoFrameProcessorTestRunner =
|
videoFrameProcessorTestRunner =
|
||||||
getDefaultFrameProcessorTestRunnerBuilder(testId)
|
getDefaultFrameProcessorTestRunnerBuilder(testId)
|
||||||
@ -218,7 +218,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_FORMAT,
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Bitmap overlayBitmap = readBitmap(OVERLAY_PNG_ASSET_PATH);
|
Bitmap overlayBitmap = readBitmap(OVERLAY_PNG_ASSET_PATH);
|
||||||
BitmapOverlay bitmapOverlay = BitmapOverlay.createStaticBitmapOverlay(overlayBitmap);
|
BitmapOverlay bitmapOverlay = BitmapOverlay.createStaticBitmapOverlay(overlayBitmap);
|
||||||
@ -242,7 +242,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
getApplicationContext(),
|
getApplicationContext(),
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_FORMAT,
|
/* inputFormat= */ MP4_ASSET.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Bitmap overlayBitmap = readBitmap(OVERLAY_PNG_ASSET_PATH);
|
Bitmap overlayBitmap = readBitmap(OVERLAY_PNG_ASSET_PATH);
|
||||||
BitmapOverlay bitmapOverlay = BitmapOverlay.createStaticBitmapOverlay(overlayBitmap);
|
BitmapOverlay bitmapOverlay = BitmapOverlay.createStaticBitmapOverlay(overlayBitmap);
|
||||||
@ -269,7 +269,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Ignore("TODO: b/344529901 - enable this test when fixed.")
|
@Ignore("TODO: b/344529901 - enable this test when fixed.")
|
||||||
public void ultraHdrBitmapAndTextOverlay_hlg10Input_matchesGoldenFile() throws Exception {
|
public void ultraHdrBitmapAndTextOverlay_hlg10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
@ -322,7 +322,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void ultraHdrBitmapOverlay_hlg10Input_matchesGoldenFile() throws Exception {
|
public void ultraHdrBitmapOverlay_hlg10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
@ -369,7 +369,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void ultraHdrBitmapOverlay_hdr10Input_matchesGoldenFile() throws Exception {
|
public void ultraHdrBitmapOverlay_hdr10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
@ -404,7 +404,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void textOverlay_hdr10Input_matchesGoldenFile() throws Exception {
|
public void textOverlay_hdr10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
@ -450,7 +450,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noEffects_hlg10Input_matchesGoldenFile() throws Exception {
|
public void noEffects_hlg10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -475,7 +475,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noEffects_hlg10InputAndHdr10Output_matchesGoldenFile() throws Exception {
|
public void noEffects_hlg10InputAndHdr10Output_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format inputFormat = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format inputFormat = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
Format outputFormat =
|
Format outputFormat =
|
||||||
inputFormat
|
inputFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
@ -509,7 +509,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noEffects_hlg10TextureInput_matchesGoldenFile() throws Exception {
|
public void noEffects_hlg10TextureInput_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -537,7 +537,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noEffects_hlg10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
public void noEffects_hlg10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
ColorInfo outputColorInfo =
|
ColorInfo outputColorInfo =
|
||||||
new ColorInfo.Builder()
|
new ColorInfo.Builder()
|
||||||
@ -571,7 +571,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noEffects_hdr10Input_matchesGoldenFile() throws Exception {
|
public void noEffects_hdr10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -596,7 +596,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noEffects_hdr10InputAndHlg10Output_matchesGoldenFile() throws Exception {
|
public void noEffects_hdr10InputAndHlg10Output_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format inputFormat = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format inputFormat = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
Format outputFormat =
|
Format outputFormat =
|
||||||
inputFormat
|
inputFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
@ -630,7 +630,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noEffects_hdr10TextureInput_matchesGoldenFile() throws Exception {
|
public void noEffects_hdr10TextureInput_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -658,7 +658,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noEffects_hdr10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
public void noEffects_hdr10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
ColorInfo outputColorInfo =
|
ColorInfo outputColorInfo =
|
||||||
new ColorInfo.Builder()
|
new ColorInfo.Builder()
|
||||||
@ -692,7 +692,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noOpEffect_hlg10Input_matchesGoldenFile() throws Exception {
|
public void noOpEffect_hlg10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -718,7 +718,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noOpEffect_hlg10TextureInput_matchesGoldenFile() throws Exception {
|
public void noOpEffect_hlg10TextureInput_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -746,7 +746,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noOpEffect_hlg10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
public void noOpEffect_hlg10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
ColorInfo outputColorInfo =
|
ColorInfo outputColorInfo =
|
||||||
new ColorInfo.Builder()
|
new ColorInfo.Builder()
|
||||||
@ -781,7 +781,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noOpEffect_hdr10Input_matchesGoldenFile() throws Exception {
|
public void noOpEffect_hdr10Input_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -807,7 +807,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
@Test
|
@Test
|
||||||
public void noOpEffect_hdr10TextureInput_matchesGoldenFile() throws Exception {
|
public void noOpEffect_hdr10TextureInput_matchesGoldenFile() throws Exception {
|
||||||
Context context = getApplicationContext();
|
Context context = getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
ColorInfo colorInfo = checkNotNull(format.colorInfo);
|
||||||
@ -835,7 +835,7 @@ public final class DefaultVideoFrameProcessorTextureOutputPixelTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noOpEffect_hdr10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
public void noOpEffect_hdr10UltraHDRImageInput_matchesGoldenFile() throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
ColorInfo outputColorInfo =
|
ColorInfo outputColorInfo =
|
||||||
new ColorInfo.Builder()
|
new ColorInfo.Builder()
|
||||||
|
@ -17,18 +17,14 @@ package androidx.media3.transformer.mh;
|
|||||||
|
|
||||||
import static androidx.media3.common.util.Util.SDK_INT;
|
import static androidx.media3.common.util.Util.SDK_INT;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_4K60_PORTRAIT_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_4K60_PORTRAIT_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_4K60_PORTRAIT;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_8K24_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_8K24;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_8K24_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_BT2020_SDR;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_BT2020_SDR;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_BT2020_SDR_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_SEF;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_SEF_H265_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_SEF_H265;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_SEF_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_PIXEL;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_TRIM_OPTIMIZATION_PIXEL_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
||||||
import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_TRANSMUXED_AND_TRANSCODED;
|
import static androidx.media3.transformer.ExportResult.CONVERSION_PROCESS_TRANSMUXED_AND_TRANSCODED;
|
||||||
@ -92,14 +88,13 @@ public class ExportTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
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 mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS.uri));
|
||||||
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
|
|
||||||
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"));
|
||||||
@ -117,8 +112,7 @@ public class ExportTest {
|
|||||||
public void exportWithoutDecodeEncode() throws Exception {
|
public void exportWithoutDecodeEncode() throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
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));
|
||||||
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.
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
@ -135,7 +129,7 @@ public class ExportTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
@ -146,8 +140,7 @@ public class ExportTest {
|
|||||||
new VideoEncoderSettings.Builder().setBitrate(5_000_000).build())
|
new VideoEncoderSettings.Builder().setBitrate(5_000_000).build())
|
||||||
.build()))
|
.build()))
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS.uri));
|
||||||
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
||||||
boolean skipCalculateSsim =
|
boolean skipCalculateSsim =
|
||||||
@ -169,7 +162,7 @@ public class ExportTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_4K60_PORTRAIT_FORMAT,
|
/* inputFormat= */ MP4_ASSET_4K60_PORTRAIT.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
// Reference: b/262710361
|
// Reference: b/262710361
|
||||||
assumeFalse(
|
assumeFalse(
|
||||||
@ -179,7 +172,7 @@ public class ExportTest {
|
|||||||
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));
|
||||||
boolean skipCalculateSsim = Util.SDK_INT < 30 && Util.DEVICE.equals("joyeuse");
|
boolean skipCalculateSsim = Util.SDK_INT < 30 && Util.DEVICE.equals("joyeuse");
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
@ -203,12 +196,12 @@ public class ExportTest {
|
|||||||
|| 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.videoFormat, /* outputFormat= */ null);
|
||||||
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_8K24_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24.uri));
|
||||||
// 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");
|
||||||
|
|
||||||
@ -231,7 +224,7 @@ public class ExportTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_8K24_FORMAT,
|
/* inputFormat= */ MP4_ASSET_8K24.videoFormat,
|
||||||
/* outputFormat= */ new Format.Builder()
|
/* outputFormat= */ new Format.Builder()
|
||||||
.setSampleMimeType(MimeTypes.VIDEO_H264)
|
.setSampleMimeType(MimeTypes.VIDEO_H264)
|
||||||
.setWidth(downscaledWidth)
|
.setWidth(downscaledWidth)
|
||||||
@ -244,7 +237,7 @@ public class ExportTest {
|
|||||||
.build()
|
.build()
|
||||||
.run(
|
.run(
|
||||||
testId,
|
testId,
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24_URI_STRING)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_8K24.uri)))
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
/* audioProcessors= */ ImmutableList.of(),
|
/* audioProcessors= */ ImmutableList.of(),
|
||||||
@ -264,14 +257,13 @@ public class ExportTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
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 mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS.uri));
|
||||||
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
||||||
boolean skipCalculateSsim =
|
boolean skipCalculateSsim =
|
||||||
@ -295,7 +287,7 @@ public class ExportTest {
|
|||||||
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
|
.setEncoderFactory(new ForceEncodeEncoderFactory(context))
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET.uri)))
|
||||||
.setRemoveVideo(true)
|
.setRemoveVideo(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -318,7 +310,7 @@ public class ExportTest {
|
|||||||
}
|
}
|
||||||
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)))
|
||||||
.setFlattenForSlowMotion(true)
|
.setFlattenForSlowMotion(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -343,7 +335,7 @@ public class ExportTest {
|
|||||||
}
|
}
|
||||||
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)))
|
||||||
.setFlattenForSlowMotion(true)
|
.setFlattenForSlowMotion(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -361,11 +353,10 @@ public class ExportTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* 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));
|
||||||
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
|
|
||||||
ImmutableList<Effect> videoEffects =
|
ImmutableList<Effect> videoEffects =
|
||||||
ImmutableList.of(new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build());
|
ImmutableList.of(new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build());
|
||||||
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
Effects effects = new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects);
|
||||||
@ -390,9 +381,12 @@ public class ExportTest {
|
|||||||
throw new AssumptionViolatedException(reason);
|
throw new AssumptionViolatedException(reason);
|
||||||
}
|
}
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_BT2020_SDR_FORMAT, /* outputFormat= */ null);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET_BT2020_SDR.videoFormat,
|
||||||
|
/* 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.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
@ -420,7 +414,7 @@ public class ExportTest {
|
|||||||
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
new MediaItem.Builder()
|
new MediaItem.Builder()
|
||||||
.setUri(MP4_TRIM_OPTIMIZATION_PIXEL_URI_STRING)
|
.setUri(MP4_TRIM_OPTIMIZATION_PIXEL.uri)
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder()
|
new MediaItem.ClippingConfiguration.Builder()
|
||||||
.setStartPositionMs(500)
|
.setStartPositionMs(500)
|
||||||
|
@ -18,9 +18,7 @@ package androidx.media3.transformer.mh;
|
|||||||
import static androidx.media3.common.util.Util.SDK_INT;
|
import static androidx.media3.common.util.Util.SDK_INT;
|
||||||
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@ -74,7 +72,8 @@ public class ForceInterpretHdrVideoAsSdrTest {
|
|||||||
|
|
||||||
// Force interpret HDR as SDR signals SDR input to the decoder, even if the actual input is HDR.
|
// Force interpret HDR as SDR signals SDR input to the decoder, even if the actual input is HDR.
|
||||||
Format decoderInputFormat =
|
Format decoderInputFormat =
|
||||||
MP4_ASSET_720P_4_SECOND_HDR10_FORMAT
|
MP4_ASSET_720P_4_SECOND_HDR10
|
||||||
|
.videoFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setColorInfo(ColorInfo.SDR_BT709_LIMITED)
|
.setColorInfo(ColorInfo.SDR_BT709_LIMITED)
|
||||||
.build();
|
.build();
|
||||||
@ -82,7 +81,7 @@ public class ForceInterpretHdrVideoAsSdrTest {
|
|||||||
|
|
||||||
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_720P_4_SECOND_HDR10)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10.uri)))
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
||||||
@ -114,7 +113,8 @@ public class ForceInterpretHdrVideoAsSdrTest {
|
|||||||
|
|
||||||
// Force interpret HDR as SDR signals SDR input to the decoder, even if the actual input is HDR.
|
// Force interpret HDR as SDR signals SDR input to the decoder, even if the actual input is HDR.
|
||||||
Format decoderInputFormat =
|
Format decoderInputFormat =
|
||||||
MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT
|
MP4_ASSET_1080P_5_SECOND_HLG10
|
||||||
|
.videoFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setColorInfo(ColorInfo.SDR_BT709_LIMITED)
|
.setColorInfo(ColorInfo.SDR_BT709_LIMITED)
|
||||||
.build();
|
.build();
|
||||||
@ -122,7 +122,8 @@ public class ForceInterpretHdrVideoAsSdrTest {
|
|||||||
|
|
||||||
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_1080P_5_SECOND_HLG10)))
|
new EditedMediaItem.Builder(
|
||||||
|
MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10.uri)))
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
||||||
|
@ -19,13 +19,9 @@ import static androidx.media3.effect.DefaultVideoFrameProcessor.WORKING_COLOR_SP
|
|||||||
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_2_SECOND_HDR10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_2_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_2_SECOND_HDR10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
||||||
import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR;
|
import static androidx.media3.transformer.Composition.HDR_MODE_KEEP_HDR;
|
||||||
@ -92,11 +88,11 @@ public final class HdrEditingTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
|
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10.uri));
|
||||||
|
|
||||||
ExportTestResult exportTestResult =
|
ExportTestResult exportTestResult =
|
||||||
new TransformerAndroidTestRunner.Builder(context, transformer)
|
new TransformerAndroidTestRunner.Builder(context, transformer)
|
||||||
@ -123,11 +119,11 @@ public final class HdrEditingTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
|
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10.uri));
|
||||||
|
|
||||||
ExportTestResult exportTestResult =
|
ExportTestResult exportTestResult =
|
||||||
new TransformerAndroidTestRunner.Builder(context, transformer)
|
new TransformerAndroidTestRunner.Builder(context, transformer)
|
||||||
@ -144,13 +140,13 @@ public final class HdrEditingTest {
|
|||||||
@Test
|
@Test
|
||||||
public void exportAndTranscode_hdr10File_whenHdrEditingIsSupported() throws Exception {
|
public void exportAndTranscode_hdr10File_whenHdrEditingIsSupported() throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
|
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
||||||
|
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
@ -169,13 +165,13 @@ public final class HdrEditingTest {
|
|||||||
@Test
|
@Test
|
||||||
public void exportAndTranscode_hlg10File_whenHdrEditingIsSupported() throws Exception {
|
public void exportAndTranscode_hlg10File_whenHdrEditingIsSupported() throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
|
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
||||||
|
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
@ -194,13 +190,13 @@ public final class HdrEditingTest {
|
|||||||
@Test
|
@Test
|
||||||
public void exportAndTranscode_dolbyVisionFile_whenHdrEditingIsSupported() throws Exception {
|
public void exportAndTranscode_dolbyVisionFile_whenHdrEditingIsSupported() throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Format format = MP4_ASSET_DOLBY_VISION_HDR_FORMAT;
|
Format format = MP4_ASSET_DOLBY_VISION_HDR.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
|
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
||||||
|
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_DOLBY_VISION_HDR));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_DOLBY_VISION_HDR.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
@ -221,7 +217,7 @@ public final class HdrEditingTest {
|
|||||||
exportAndTranscode_av1FileWithAv1HdrEditingUnsupportedAndHevcHdrEditingSupported_fallsBackToH265()
|
exportAndTranscode_av1FileWithAv1HdrEditingUnsupportedAndHevcHdrEditingSupported_fallsBackToH265()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Format format = MP4_ASSET_AV1_2_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_AV1_2_SECOND_HDR10.videoFormat;
|
||||||
if (EncoderUtil.getSupportedEncodersForHdrEditing(MimeTypes.VIDEO_H265, format.colorInfo)
|
if (EncoderUtil.getSupportedEncodersForHdrEditing(MimeTypes.VIDEO_H265, format.colorInfo)
|
||||||
.isEmpty()) {
|
.isEmpty()) {
|
||||||
String skipReason = "No H265 HDR editing support for " + format.colorInfo;
|
String skipReason = "No H265 HDR editing support for " + format.colorInfo;
|
||||||
@ -242,7 +238,7 @@ public final class HdrEditingTest {
|
|||||||
/* outputFormat= */ format.buildUpon().setSampleMimeType(MimeTypes.VIDEO_H265).build());
|
/* outputFormat= */ format.buildUpon().setSampleMimeType(MimeTypes.VIDEO_H265).build());
|
||||||
|
|
||||||
Transformer transformer = new Transformer.Builder(context).build();
|
Transformer transformer = new Transformer.Builder(context).build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_AV1_2_SECOND_HDR10));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_AV1_2_SECOND_HDR10.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
@ -260,7 +256,7 @@ public final class HdrEditingTest {
|
|||||||
public void exportAndTranscodeHdr_ignoringSdrWorkingColorSpace_whenHdrEditingIsSupported()
|
public void exportAndTranscodeHdr_ignoringSdrWorkingColorSpace_whenHdrEditingIsSupported()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceSupportsHdrEditing(testId, format);
|
assumeDeviceSupportsHdrEditing(testId, format);
|
||||||
|
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ format);
|
||||||
@ -273,7 +269,8 @@ public final class HdrEditingTest {
|
|||||||
.build())
|
.build())
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
|
new EditedMediaItem.Builder(
|
||||||
|
MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10.uri)))
|
||||||
.setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS)
|
.setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -293,7 +290,7 @@ public final class HdrEditingTest {
|
|||||||
public void exportAndTranscode_hdr10File_whenHdrEditingUnsupported_toneMapsOrThrows()
|
public void exportAndTranscode_hdr10File_whenHdrEditingUnsupported_toneMapsOrThrows()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Format format = MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
Format format = MP4_ASSET_720P_4_SECOND_HDR10.videoFormat;
|
||||||
assumeDeviceDoesNotSupportHdrEditing(testId, format);
|
assumeDeviceDoesNotSupportHdrEditing(testId, format);
|
||||||
|
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
@ -317,7 +314,7 @@ public final class HdrEditingTest {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
@ -352,7 +349,7 @@ public final class HdrEditingTest {
|
|||||||
public void exportAndTranscode_hlg10File_whenHdrEditingUnsupported_toneMapsOrThrows()
|
public void exportAndTranscode_hlg10File_whenHdrEditingUnsupported_toneMapsOrThrows()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
Format format = MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
Format format = MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat;
|
||||||
assumeDeviceDoesNotSupportHdrEditing(testId, format);
|
assumeDeviceDoesNotSupportHdrEditing(testId, format);
|
||||||
|
|
||||||
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
assumeFormatsSupported(context, testId, /* inputFormat= */ format, /* outputFormat= */ null);
|
||||||
@ -374,7 +371,7 @@ public final class HdrEditingTest {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
|
@ -18,9 +18,7 @@ package androidx.media3.transformer.mh;
|
|||||||
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
import static androidx.media3.transformer.AndroidTestUtil.FORCE_TRANSCODE_VIDEO_EFFECTS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10_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 com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@ -67,7 +65,7 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
|
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
@ -87,7 +85,7 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10.uri)))
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
||||||
@ -127,7 +125,7 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
|
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
@ -147,7 +145,8 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
|
new EditedMediaItem.Builder(
|
||||||
|
MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10.uri)))
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
new Composition.Builder(new EditedMediaItemSequence(editedMediaItem))
|
||||||
@ -187,7 +186,7 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
|
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
@ -207,7 +206,7 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_720P_4_SECOND_HDR10.uri)))
|
||||||
.setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS)
|
.setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS)
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
@ -248,7 +247,7 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
|
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
@ -268,7 +267,8 @@ public class ToneMapHdrToSdrUsingMediaCodecTest {
|
|||||||
})
|
})
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10)))
|
new EditedMediaItem.Builder(
|
||||||
|
MediaItem.fromUri(Uri.parse(MP4_ASSET_1080P_5_SECOND_HLG10.uri)))
|
||||||
.setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS)
|
.setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS)
|
||||||
.build();
|
.build();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
|
@ -17,11 +17,8 @@ package androidx.media3.transformer.mh;
|
|||||||
|
|
||||||
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DOLBY_VISION_HDR_FORMAT;
|
|
||||||
import static androidx.media3.transformer.mh.HdrCapabilitiesUtil.assumeDeviceSupportsOpenGlToneMapping;
|
import static androidx.media3.transformer.mh.HdrCapabilitiesUtil.assumeDeviceSupportsOpenGlToneMapping;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@ -61,25 +58,25 @@ public class ToneMapHdrToSdrUsingOpenGlTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_toneMap_hlg10File_toneMaps() throws Exception {
|
public void export_toneMap_hlg10File_toneMaps() throws Exception {
|
||||||
assumeDeviceSupportsOpenGlToneMapping(
|
assumeDeviceSupportsOpenGlToneMapping(
|
||||||
testId, /* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
testId, /* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
|
|
||||||
runTransformerWithOpenGlToneMapping(testId, MP4_ASSET_1080P_5_SECOND_HLG10);
|
runTransformerWithOpenGlToneMapping(testId, MP4_ASSET_1080P_5_SECOND_HLG10.uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void export_toneMap_hdr10File_toneMaps() throws Exception {
|
public void export_toneMap_hdr10File_toneMaps() throws Exception {
|
||||||
assumeDeviceSupportsOpenGlToneMapping(
|
assumeDeviceSupportsOpenGlToneMapping(
|
||||||
testId, /* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
testId, /* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
|
|
||||||
runTransformerWithOpenGlToneMapping(testId, MP4_ASSET_720P_4_SECOND_HDR10);
|
runTransformerWithOpenGlToneMapping(testId, MP4_ASSET_720P_4_SECOND_HDR10.uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void export_toneMap_dolbyVisionFile_toneMaps() throws Exception {
|
public void export_toneMap_dolbyVisionFile_toneMaps() throws Exception {
|
||||||
assumeDeviceSupportsOpenGlToneMapping(
|
assumeDeviceSupportsOpenGlToneMapping(
|
||||||
testId, /* inputFormat= */ MP4_ASSET_DOLBY_VISION_HDR_FORMAT);
|
testId, /* inputFormat= */ MP4_ASSET_DOLBY_VISION_HDR.videoFormat);
|
||||||
|
|
||||||
runTransformerWithOpenGlToneMapping(testId, MP4_ASSET_DOLBY_VISION_HDR);
|
runTransformerWithOpenGlToneMapping(testId, MP4_ASSET_DOLBY_VISION_HDR.uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runTransformerWithOpenGlToneMapping(String testId, String fileUri) throws Exception {
|
private void runTransformerWithOpenGlToneMapping(String testId, String fileUri) throws Exception {
|
||||||
|
@ -60,8 +60,8 @@ public final class TranscodeQualityTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* outputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT);
|
/* outputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat);
|
||||||
// Skip on specific pre-API 34 devices where calculating SSIM fails.
|
// Skip on specific pre-API 34 devices where calculating SSIM fails.
|
||||||
assumeFalse(
|
assumeFalse(
|
||||||
(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")))
|
||||||
@ -80,8 +80,7 @@ public final class TranscodeQualityTest {
|
|||||||
.build())
|
.build())
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS.uri));
|
||||||
Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
||||||
|
|
||||||
@ -103,8 +102,9 @@ public final class TranscodeQualityTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* outputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT
|
/* outputFormat= */ AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS
|
||||||
|
.videoFormat
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setSampleMimeType(MimeTypes.VIDEO_H265)
|
.setSampleMimeType(MimeTypes.VIDEO_H265)
|
||||||
.build());
|
.build());
|
||||||
@ -114,8 +114,7 @@ public final class TranscodeQualityTest {
|
|||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context).setVideoMimeType(MimeTypes.VIDEO_H265).build();
|
new Transformer.Builder(context).setVideoMimeType(MimeTypes.VIDEO_H265).build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS.uri));
|
||||||
Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
||||||
|
|
||||||
@ -145,8 +144,7 @@ public final class TranscodeQualityTest {
|
|||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
MediaItem.fromUri(
|
MediaItem.fromUri(
|
||||||
Uri.parse(
|
Uri.parse(AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.uri));
|
||||||
AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
new EditedMediaItem.Builder(mediaItem).setRemoveAudio(true).build();
|
||||||
|
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
package androidx.media3.transformer.mh;
|
package androidx.media3.transformer.mh;
|
||||||
|
|
||||||
import static androidx.media3.common.MimeTypes.VIDEO_H264;
|
import static androidx.media3.common.MimeTypes.VIDEO_H264;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ULTRA_HDR_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.ULTRA_HDR_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@ -63,15 +63,15 @@ public class TranscodeSpeedTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ AndroidTestUtil.MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
/* outputFormat= */ AndroidTestUtil.MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT);
|
/* outputFormat= */ MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setVideoMimeType(MimeTypes.VIDEO_H264)
|
.setVideoMimeType(MimeTypes.VIDEO_H264)
|
||||||
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem =
|
||||||
MediaItem.fromUri(Uri.parse(MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING))
|
MediaItem.fromUri(Uri.parse(MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS.uri))
|
||||||
.buildUpon()
|
.buildUpon()
|
||||||
.setClippingConfiguration(
|
.setClippingConfiguration(
|
||||||
new MediaItem.ClippingConfiguration.Builder().setEndPositionMs(15_000).build())
|
new MediaItem.ClippingConfiguration.Builder().setEndPositionMs(15_000).build())
|
||||||
@ -101,7 +101,7 @@ public class TranscodeSpeedTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ AndroidTestUtil.MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS_FORMAT,
|
/* inputFormat= */ MP4_LONG_ASSET_WITH_INCREASING_TIMESTAMPS.videoFormat,
|
||||||
outputFormat);
|
outputFormat);
|
||||||
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
DefaultVideoFrameProcessor.Factory videoFrameProcessorFactory =
|
||||||
new DefaultVideoFrameProcessor.Factory.Builder()
|
new DefaultVideoFrameProcessor.Factory.Builder()
|
||||||
@ -126,7 +126,7 @@ public class TranscodeSpeedTest {
|
|||||||
// This test uses ULTRA_HDR_URI_STRING because it's high resolution.
|
// This test uses ULTRA_HDR_URI_STRING because it's high resolution.
|
||||||
// Ultra HDR gainmap is ignored.
|
// Ultra HDR gainmap is ignored.
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(ULTRA_HDR_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(JPG_ULTRA_HDR_ASSET.uri))
|
||||||
.setFrameRate(30)
|
.setFrameRate(30)
|
||||||
.setDurationUs(isHighPerformance ? 45_000_000 : 15_000_000)
|
.setDurationUs(isHighPerformance ? 45_000_000 : 15_000_000)
|
||||||
.setEffects(
|
.setEffects(
|
||||||
|
@ -19,12 +19,9 @@ package androidx.media3.transformer.mh;
|
|||||||
|
|
||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_720P_4_SECOND_HDR10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_2_SECOND_HDR10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_2_SECOND_HDR10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_2_SECOND_HDR10_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_PORTRAIT_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_PORTRAIT_ASSET_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
|
import static androidx.media3.transformer.AndroidTestUtil.extractBitmapsFromVideo;
|
||||||
import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT;
|
import static androidx.media3.transformer.SequenceEffectTestUtil.NO_EFFECT;
|
||||||
@ -89,17 +86,17 @@ public final class TransformerHdrSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withSdrThenHdr() throws Exception {
|
public void export_withSdrThenHdr() throws Exception {
|
||||||
assumeDeviceSupportsOpenGlToneMapping(
|
assumeDeviceSupportsOpenGlToneMapping(
|
||||||
testId, /* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
testId, /* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_PORTRAIT_ASSET_URI_STRING,
|
MP4_PORTRAIT_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new Crop(/* left= */ -1, /* right= */ 0, /* bottom= */ -1, /* top= */ 0)),
|
new Crop(/* left= */ -1, /* right= */ 0, /* bottom= */ -1, /* top= */ 0)),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_720P_4_SECOND_HDR10,
|
MP4_ASSET_720P_4_SECOND_HDR10.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
||||||
@ -122,22 +119,22 @@ public final class TransformerHdrSequenceEffectTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void export_withHdrThenSdr_whenHdrEditingSupported_throws() throws Exception {
|
public void export_withHdrThenSdr_whenHdrEditingSupported_throws() throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_720P_4_SECOND_HDR10,
|
MP4_ASSET_720P_4_SECOND_HDR10.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_PORTRAIT_ASSET_URI_STRING,
|
MP4_PORTRAIT_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new Crop(/* left= */ -1, /* right= */ 0, /* bottom= */ -1, /* top= */ 0)),
|
new Crop(/* left= */ -1, /* right= */ 0, /* bottom= */ -1, /* top= */ 0)),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
||||||
@ -161,24 +158,24 @@ public final class TransformerHdrSequenceEffectTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void export_withHdrThenSdr_whenHdrEditingUnsupported() throws Exception {
|
public void export_withHdrThenSdr_whenHdrEditingUnsupported() throws Exception {
|
||||||
assumeDeviceDoesNotSupportHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
assumeDeviceDoesNotSupportHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeDeviceSupportsOpenGlToneMapping(
|
assumeDeviceSupportsOpenGlToneMapping(
|
||||||
testId, /* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
testId, /* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_720P_4_SECOND_HDR10,
|
MP4_ASSET_720P_4_SECOND_HDR10.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_PORTRAIT_ASSET_URI_STRING,
|
MP4_PORTRAIT_ASSET.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new Crop(/* left= */ -1, /* right= */ 0, /* bottom= */ -1, /* top= */ 0)),
|
new Crop(/* left= */ -1, /* right= */ 0, /* bottom= */ -1, /* top= */ 0)),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
||||||
@ -198,22 +195,22 @@ public final class TransformerHdrSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withHdr10ThenHdr10_whenHdrEditingSupported_producesExpectedFrame()
|
public void export_withHdr10ThenHdr10_whenHdrEditingSupported_producesExpectedFrame()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_720P_4_SECOND_HDR10,
|
MP4_ASSET_720P_4_SECOND_HDR10.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_720P_4_SECOND_HDR10,
|
MP4_ASSET_720P_4_SECOND_HDR10.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
||||||
@ -232,28 +229,28 @@ public final class TransformerHdrSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export_withHlg10ThenHdr10_whenHdrEditingSupported_producesExpectedFrame()
|
public void export_withHlg10ThenHdr10_whenHdrEditingSupported_producesExpectedFrame()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_720P_4_SECOND_HDR10.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
/* outputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_720P_4_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
/* outputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
Presentation.createForHeight(EXPORT_HEIGHT),
|
Presentation.createForHeight(EXPORT_HEIGHT),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_1080P_5_SECOND_HLG10,
|
MP4_ASSET_1080P_5_SECOND_HLG10.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS),
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_720P_4_SECOND_HDR10,
|
MP4_ASSET_720P_4_SECOND_HDR10.uri,
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()),
|
||||||
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
/* endPositionMs= */ SINGLE_30_FPS_VIDEO_FRAME_THRESHOLD_MS));
|
||||||
@ -273,22 +270,22 @@ public final class TransformerHdrSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export1920x1080Hlg_withAllAvailableDecoders_doesNotStretchOutputOnAny()
|
public void export1920x1080Hlg_withAllAvailableDecoders_doesNotStretchOutputOnAny()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
/* outputFormat= */ MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
List<MediaCodecInfo> mediaCodecInfoList =
|
List<MediaCodecInfo> mediaCodecInfoList =
|
||||||
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
||||||
checkNotNull(MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT.sampleMimeType),
|
checkNotNull(MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat.sampleMimeType),
|
||||||
/* requiresSecureDecoder= */ false,
|
/* requiresSecureDecoder= */ false,
|
||||||
/* requiresTunnelingDecoder= */ false);
|
/* requiresTunnelingDecoder= */ false);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(
|
clippedVideo(
|
||||||
MP4_ASSET_1080P_5_SECOND_HLG10,
|
MP4_ASSET_1080P_5_SECOND_HLG10.uri,
|
||||||
NO_EFFECT,
|
NO_EFFECT,
|
||||||
/* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
/* endPositionMs= */ C.MILLIS_PER_SECOND / 4));
|
||||||
|
|
||||||
@ -312,21 +309,21 @@ public final class TransformerHdrSequenceEffectTest {
|
|||||||
@Test
|
@Test
|
||||||
public void export720x1280Av1Hdr10_withAllAvailableDecoders_doesNotStretchOutputOnAny()
|
public void export720x1280Av1Hdr10_withAllAvailableDecoders_doesNotStretchOutputOnAny()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_AV1_2_SECOND_HDR10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_AV1_2_SECOND_HDR10.videoFormat);
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ MP4_ASSET_AV1_2_SECOND_HDR10_FORMAT,
|
/* inputFormat= */ MP4_ASSET_AV1_2_SECOND_HDR10.videoFormat,
|
||||||
/* outputFormat= */ MP4_ASSET_AV1_2_SECOND_HDR10_FORMAT);
|
/* outputFormat= */ MP4_ASSET_AV1_2_SECOND_HDR10.videoFormat);
|
||||||
List<MediaCodecInfo> mediaCodecInfoList =
|
List<MediaCodecInfo> mediaCodecInfoList =
|
||||||
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
MediaCodecSelector.DEFAULT.getDecoderInfos(
|
||||||
checkNotNull(MP4_ASSET_AV1_2_SECOND_HDR10_FORMAT.sampleMimeType),
|
checkNotNull(MP4_ASSET_AV1_2_SECOND_HDR10.videoFormat.sampleMimeType),
|
||||||
/* requiresSecureDecoder= */ false,
|
/* requiresSecureDecoder= */ false,
|
||||||
/* requiresTunnelingDecoder= */ false);
|
/* requiresTunnelingDecoder= */ false);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(MP4_ASSET_AV1_2_SECOND_HDR10, NO_EFFECT, C.MILLIS_PER_SECOND / 4));
|
clippedVideo(MP4_ASSET_AV1_2_SECOND_HDR10.uri, NO_EFFECT, C.MILLIS_PER_SECOND / 4));
|
||||||
|
|
||||||
boolean atLeastOneDecoderSucceeds = false;
|
boolean atLeastOneDecoderSucceeds = false;
|
||||||
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
for (MediaCodecInfo mediaCodecInfo : mediaCodecInfoList) {
|
||||||
|
@ -18,9 +18,8 @@
|
|||||||
package androidx.media3.transformer.mh;
|
package androidx.media3.transformer.mh;
|
||||||
|
|
||||||
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
import static androidx.media3.test.utils.TestUtil.retrieveTrackFormat;
|
||||||
|
import static androidx.media3.transformer.AndroidTestUtil.JPG_ULTRA_HDR_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.ULTRA_HDR_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assertSdrColors;
|
import static androidx.media3.transformer.AndroidTestUtil.assertSdrColors;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
import static androidx.media3.transformer.AndroidTestUtil.recordTestSkipped;
|
||||||
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;
|
||||||
@ -76,7 +75,7 @@ public final class TransformerMhUltraHdrTest {
|
|||||||
assumeDeviceSupportsUltraHdrEditing();
|
assumeDeviceSupportsUltraHdrEditing();
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ false, oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT));
|
/* tonemap= */ false, oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
||||||
@ -95,8 +94,8 @@ public final class TransformerMhUltraHdrTest {
|
|||||||
Composition composition =
|
Composition composition =
|
||||||
createComposition(
|
createComposition(
|
||||||
/* presentation= */ null,
|
/* presentation= */ null,
|
||||||
clippedVideo(MP4_ASSET_1080P_5_SECOND_HLG10, NO_EFFECT, ONE_FRAME_END_POSITION_MS),
|
clippedVideo(MP4_ASSET_1080P_5_SECOND_HLG10.uri, NO_EFFECT, ONE_FRAME_END_POSITION_MS),
|
||||||
oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT));
|
oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
||||||
@ -115,8 +114,8 @@ public final class TransformerMhUltraHdrTest {
|
|||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ false,
|
/* tonemap= */ false,
|
||||||
oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT),
|
oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT),
|
||||||
clippedVideo(MP4_ASSET_1080P_5_SECOND_HLG10, NO_EFFECT, ONE_FRAME_END_POSITION_MS));
|
clippedVideo(MP4_ASSET_1080P_5_SECOND_HLG10.uri, NO_EFFECT, ONE_FRAME_END_POSITION_MS));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
||||||
@ -131,12 +130,12 @@ public final class TransformerMhUltraHdrTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void exportTonemappedHdrVideoThenUltraHdrImage_exportsSdr() throws Exception {
|
public void exportTonemappedHdrVideoThenUltraHdrImage_exportsSdr() throws Exception {
|
||||||
assumeDeviceSupportsOpenGlToneMapping(testId, MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
assumeDeviceSupportsOpenGlToneMapping(testId, MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
Composition composition =
|
Composition composition =
|
||||||
createUltraHdrComposition(
|
createUltraHdrComposition(
|
||||||
/* tonemap= */ true,
|
/* tonemap= */ true,
|
||||||
clippedVideo(MP4_ASSET_1080P_5_SECOND_HLG10, NO_EFFECT, ONE_FRAME_END_POSITION_MS),
|
clippedVideo(MP4_ASSET_1080P_5_SECOND_HLG10.uri, NO_EFFECT, ONE_FRAME_END_POSITION_MS),
|
||||||
oneFrameFromImage(ULTRA_HDR_URI_STRING, NO_EFFECT));
|
oneFrameFromImage(JPG_ULTRA_HDR_ASSET.uri, NO_EFFECT));
|
||||||
|
|
||||||
ExportTestResult result =
|
ExportTestResult result =
|
||||||
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
new TransformerAndroidTestRunner.Builder(context, new Transformer.Builder(context).build())
|
||||||
@ -163,6 +162,6 @@ public final class TransformerMhUltraHdrTest {
|
|||||||
getApplicationContext(), testId, "Ultra HDR is not supported on this API level.");
|
getApplicationContext(), testId, "Ultra HDR is not supported on this API level.");
|
||||||
throw new AssumptionViolatedException("Ultra HDR is not supported on this API level.");
|
throw new AssumptionViolatedException("Ultra HDR is not supported on this API level.");
|
||||||
}
|
}
|
||||||
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10_FORMAT);
|
assumeDeviceSupportsHdrEditing(testId, MP4_ASSET_1080P_5_SECOND_HLG10.videoFormat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package androidx.media3.transformer.mh;
|
package androidx.media3.transformer.mh;
|
||||||
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_VIDEO_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_VIDEO;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_AV1_VIDEO_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@ -57,13 +56,16 @@ public class TransformerWithInAppMuxerEndToEndMhTest {
|
|||||||
public void videoEditing_forAv1Video_completesSuccessfully() throws Exception {
|
public void videoEditing_forAv1Video_completesSuccessfully() throws Exception {
|
||||||
Context context = ApplicationProvider.getApplicationContext();
|
Context context = ApplicationProvider.getApplicationContext();
|
||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context, testId, /* inputFormat= */ MP4_ASSET_AV1_VIDEO_FORMAT, /* outputFormat= */ null);
|
context,
|
||||||
|
testId,
|
||||||
|
/* inputFormat= */ MP4_ASSET_AV1_VIDEO.videoFormat,
|
||||||
|
/* outputFormat= */ null);
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
.setMuxerFactory(new InAppMuxer.Factory.Builder().build())
|
.setMuxerFactory(new InAppMuxer.Factory.Builder().build())
|
||||||
.build();
|
.build();
|
||||||
ImmutableList<Effect> videoEffects = ImmutableList.of(RgbFilter.createGrayscaleFilter());
|
ImmutableList<Effect> videoEffects = ImmutableList.of(RgbFilter.createGrayscaleFilter());
|
||||||
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_AV1_VIDEO_URI_STRING));
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_AV1_VIDEO.uri));
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem)
|
new EditedMediaItem.Builder(mediaItem)
|
||||||
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
||||||
|
@ -41,6 +41,7 @@ import android.net.Uri;
|
|||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
import androidx.media3.common.util.Assertions;
|
import androidx.media3.common.util.Assertions;
|
||||||
import androidx.media3.transformer.AndroidTestUtil;
|
import androidx.media3.transformer.AndroidTestUtil;
|
||||||
|
import androidx.media3.transformer.AndroidTestUtil.AssetInfo;
|
||||||
import androidx.media3.transformer.DefaultEncoderFactory;
|
import androidx.media3.transformer.DefaultEncoderFactory;
|
||||||
import androidx.media3.transformer.EditedMediaItem;
|
import androidx.media3.transformer.EditedMediaItem;
|
||||||
import androidx.media3.transformer.Transformer;
|
import androidx.media3.transformer.Transformer;
|
||||||
@ -68,7 +69,7 @@ import org.junit.runners.Parameterized.Parameters;
|
|||||||
"Analysis tests are not used for confirming Transformer is running properly, and not configured"
|
"Analysis tests are not used for confirming Transformer is running properly, and not configured"
|
||||||
+ " for this use as they're missing skip checks for unsupported devices.")
|
+ " for this use as they're missing skip checks for unsupported devices.")
|
||||||
public class BitrateAnalysisTest {
|
public class BitrateAnalysisTest {
|
||||||
private static final ImmutableList<String> INPUT_FILES =
|
private static final ImmutableList<AssetInfo> INPUT_ASSETS =
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
MP4_REMOTE_640W_480H_31_SECOND_ROOF_SONYXPERIAXZ3,
|
MP4_REMOTE_640W_480H_31_SECOND_ROOF_SONYXPERIAXZ3,
|
||||||
MP4_REMOTE_1280W_720H_5_SECOND_HIGHMOTION,
|
MP4_REMOTE_1280W_720H_5_SECOND_HIGHMOTION,
|
||||||
@ -102,15 +103,15 @@ public class BitrateAnalysisTest {
|
|||||||
public int bitrateMode;
|
public int bitrateMode;
|
||||||
|
|
||||||
@Parameter(2)
|
@Parameter(2)
|
||||||
public @MonotonicNonNull String fileUri;
|
public @MonotonicNonNull AssetInfo assetInfo;
|
||||||
|
|
||||||
@Parameters(name = "analyzeBitrate_{0}_{1}_{2}")
|
@Parameters(name = "analyzeBitrate_{0}_{1}_{2}")
|
||||||
public static List<Object[]> parameters() {
|
public static List<Object[]> parameters() {
|
||||||
List<Object[]> parameterList = new ArrayList<>();
|
List<Object[]> parameterList = new ArrayList<>();
|
||||||
for (int bitrate = START_BITRATE; bitrate <= END_BITRATE; bitrate += BITRATE_INTERVAL) {
|
for (int bitrate = START_BITRATE; bitrate <= END_BITRATE; bitrate += BITRATE_INTERVAL) {
|
||||||
for (int mode : INPUT_BITRATE_MODES) {
|
for (int mode : INPUT_BITRATE_MODES) {
|
||||||
for (String file : INPUT_FILES) {
|
for (AssetInfo assetInfo : INPUT_ASSETS) {
|
||||||
parameterList.add(new Object[] {bitrate, mode, file});
|
parameterList.add(new Object[] {bitrate, mode, assetInfo});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,8 +121,9 @@ public class BitrateAnalysisTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void analyzeBitrate() throws Exception {
|
public void analyzeBitrate() throws Exception {
|
||||||
Assertions.checkNotNull(fileUri);
|
Assertions.checkNotNull(assetInfo);
|
||||||
String fileName = Assertions.checkNotNull(Iterables.getLast(Splitter.on("/").split(fileUri)));
|
String fileName =
|
||||||
|
Assertions.checkNotNull(Iterables.getLast(Splitter.on("/").split(assetInfo.uri)));
|
||||||
String testId = String.format("analyzeBitrate_ssim_%s_%d_%s", bitrate, bitrateMode, fileName);
|
String testId = String.format("analyzeBitrate_ssim_%s_%d_%s", bitrate, bitrateMode, fileName);
|
||||||
|
|
||||||
Map<String, Object> inputValues = new HashMap<>();
|
Map<String, Object> inputValues = new HashMap<>();
|
||||||
@ -137,11 +139,8 @@ public class BitrateAnalysisTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ AndroidTestUtil.getFormatForTestFile(fileUri),
|
/* inputFormat= */ assetInfo.videoFormat,
|
||||||
/* outputFormat= */ AndroidTestUtil.getFormatForTestFile(fileUri)
|
/* outputFormat= */ assetInfo.videoFormat.buildUpon().setAverageBitrate(bitrate).build());
|
||||||
.buildUpon()
|
|
||||||
.setAverageBitrate(bitrate)
|
|
||||||
.build());
|
|
||||||
|
|
||||||
Transformer transformer =
|
Transformer transformer =
|
||||||
new Transformer.Builder(context)
|
new Transformer.Builder(context)
|
||||||
@ -157,7 +156,7 @@ public class BitrateAnalysisTest {
|
|||||||
.build()))
|
.build()))
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(fileUri)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(assetInfo.uri)))
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ import android.net.Uri;
|
|||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
import androidx.media3.transformer.AndroidTestUtil;
|
import androidx.media3.transformer.AndroidTestUtil;
|
||||||
|
import androidx.media3.transformer.AndroidTestUtil.AssetInfo;
|
||||||
import androidx.media3.transformer.DefaultEncoderFactory;
|
import androidx.media3.transformer.DefaultEncoderFactory;
|
||||||
import androidx.media3.transformer.EditedMediaItem;
|
import androidx.media3.transformer.EditedMediaItem;
|
||||||
import androidx.media3.transformer.Transformer;
|
import androidx.media3.transformer.Transformer;
|
||||||
@ -51,11 +52,11 @@ import org.junit.runners.Parameterized.Parameters;
|
|||||||
+ " for this use as they're missing skip checks for unsupported devices.")
|
+ " for this use as they're missing skip checks for unsupported devices.")
|
||||||
public class EncoderPerformanceAnalysisTest {
|
public class EncoderPerformanceAnalysisTest {
|
||||||
|
|
||||||
private static final ImmutableList<String> INPUT_FILES =
|
private static final ImmutableList<AssetInfo> INPUT_ASSETS =
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S_URI_STRING,
|
AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S,
|
||||||
AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING,
|
AndroidTestUtil.MP4_ASSET_WITH_INCREASING_TIMESTAMPS,
|
||||||
AndroidTestUtil.MP4_ASSET_4K60_PORTRAIT_URI_STRING);
|
AndroidTestUtil.MP4_ASSET_4K60_PORTRAIT);
|
||||||
|
|
||||||
private static final ImmutableList<Integer> OPERATING_RATE_SETTINGS =
|
private static final ImmutableList<Integer> OPERATING_RATE_SETTINGS =
|
||||||
ImmutableList.of(VideoEncoderSettings.NO_VALUE, 30, Integer.MAX_VALUE);
|
ImmutableList.of(VideoEncoderSettings.NO_VALUE, 30, Integer.MAX_VALUE);
|
||||||
@ -68,7 +69,7 @@ public class EncoderPerformanceAnalysisTest {
|
|||||||
MEDIA_CODEC_PRIORITY_REALTIME);
|
MEDIA_CODEC_PRIORITY_REALTIME);
|
||||||
|
|
||||||
@Parameter(0)
|
@Parameter(0)
|
||||||
public @MonotonicNonNull String fileUri;
|
public @MonotonicNonNull AssetInfo assetInfo;
|
||||||
|
|
||||||
@Parameter(1)
|
@Parameter(1)
|
||||||
public int operatingRate;
|
public int operatingRate;
|
||||||
@ -79,12 +80,12 @@ public class EncoderPerformanceAnalysisTest {
|
|||||||
@Parameters(name = "analyzePerformance_{0}_OpRate={1}_Priority={2}")
|
@Parameters(name = "analyzePerformance_{0}_OpRate={1}_Priority={2}")
|
||||||
public static ImmutableList<Object[]> parameters() {
|
public static ImmutableList<Object[]> parameters() {
|
||||||
ImmutableList.Builder<Object[]> parametersBuilder = new ImmutableList.Builder<>();
|
ImmutableList.Builder<Object[]> parametersBuilder = new ImmutableList.Builder<>();
|
||||||
for (int i = 0; i < INPUT_FILES.size(); i++) {
|
for (int i = 0; i < INPUT_ASSETS.size(); i++) {
|
||||||
for (int j = 0; j < OPERATING_RATE_SETTINGS.size(); j++) {
|
for (int j = 0; j < OPERATING_RATE_SETTINGS.size(); j++) {
|
||||||
for (int k = 0; k < PRIORITY_SETTINGS.size(); k++) {
|
for (int k = 0; k < PRIORITY_SETTINGS.size(); k++) {
|
||||||
parametersBuilder.add(
|
parametersBuilder.add(
|
||||||
new Object[] {
|
new Object[] {
|
||||||
INPUT_FILES.get(i), OPERATING_RATE_SETTINGS.get(j), PRIORITY_SETTINGS.get(k)
|
INPUT_ASSETS.get(i), OPERATING_RATE_SETTINGS.get(j), PRIORITY_SETTINGS.get(k)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,8 +95,8 @@ public class EncoderPerformanceAnalysisTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void analyzeEncoderPerformance() throws Exception {
|
public void analyzeEncoderPerformance() throws Exception {
|
||||||
checkNotNull(fileUri);
|
checkNotNull(assetInfo.uri);
|
||||||
String filename = checkNotNull(Uri.parse(fileUri).getLastPathSegment());
|
String filename = checkNotNull(Uri.parse(assetInfo.uri).getLastPathSegment());
|
||||||
String testId =
|
String testId =
|
||||||
Util.formatInvariant(
|
Util.formatInvariant(
|
||||||
"analyzePerformance_%s_OpRate_%d_Priority_%d", filename, operatingRate, priority);
|
"analyzePerformance_%s_OpRate_%d_Priority_%d", filename, operatingRate, priority);
|
||||||
@ -104,8 +105,8 @@ public class EncoderPerformanceAnalysisTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
context,
|
context,
|
||||||
testId,
|
testId,
|
||||||
/* inputFormat= */ AndroidTestUtil.getFormatForTestFile(fileUri),
|
/* inputFormat= */ assetInfo.videoFormat,
|
||||||
/* outputFormat= */ AndroidTestUtil.getFormatForTestFile(fileUri));
|
/* outputFormat= */ assetInfo.videoFormat);
|
||||||
|
|
||||||
if (Util.SDK_INT < 23) {
|
if (Util.SDK_INT < 23) {
|
||||||
recordTestSkipped(
|
recordTestSkipped(
|
||||||
@ -133,7 +134,7 @@ public class EncoderPerformanceAnalysisTest {
|
|||||||
.build()))
|
.build()))
|
||||||
.build();
|
.build();
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(fileUri)))
|
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(assetInfo.uri)))
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
@ -54,8 +54,7 @@ public final class RepeatedTranscodeTest {
|
|||||||
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
||||||
.build())
|
.build())
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS.uri));
|
||||||
MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
new EditedMediaItem.Builder(mediaItem).setEffects(FORCE_TRANSCODE_VIDEO_EFFECTS).build();
|
||||||
|
|
||||||
@ -84,8 +83,7 @@ public final class RepeatedTranscodeTest {
|
|||||||
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
||||||
.build())
|
.build())
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS.uri));
|
||||||
MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem)
|
new EditedMediaItem.Builder(mediaItem)
|
||||||
.setRemoveAudio(true)
|
.setRemoveAudio(true)
|
||||||
@ -118,8 +116,7 @@ public final class RepeatedTranscodeTest {
|
|||||||
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
.setEncoderFactory(new AndroidTestUtil.ForceEncodeEncoderFactory(context))
|
||||||
.build())
|
.build())
|
||||||
.build();
|
.build();
|
||||||
MediaItem mediaItem =
|
MediaItem mediaItem = MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS.uri));
|
||||||
MediaItem.fromUri(Uri.parse(AndroidTestUtil.MP4_REMOTE_10_SECONDS_URI_STRING));
|
|
||||||
EditedMediaItem editedMediaItem =
|
EditedMediaItem editedMediaItem =
|
||||||
new EditedMediaItem.Builder(mediaItem).setRemoveVideo(true).build();
|
new EditedMediaItem.Builder(mediaItem).setRemoveVideo(true).build();
|
||||||
|
|
||||||
|
@ -42,7 +42,6 @@ import static androidx.media3.transformer.AndroidTestUtil.MP4_REMOTE_7680W_4320H
|
|||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_REMOTE_854W_480H_30_SECOND_ROOF_ONEPLUSNORD2_DOWNSAMPLED;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_REMOTE_854W_480H_30_SECOND_ROOF_ONEPLUSNORD2_DOWNSAMPLED;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_REMOTE_854W_480H_30_SECOND_ROOF_REDMINOTE9_DOWNSAMPLED;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_REMOTE_854W_480H_30_SECOND_ROOF_REDMINOTE9_DOWNSAMPLED;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
import static androidx.media3.transformer.AndroidTestUtil.assumeFormatsSupported;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.getFormatForTestFile;
|
|
||||||
import static androidx.media3.transformer.ExportTestResult.SSIM_UNSET;
|
import static androidx.media3.transformer.ExportTestResult.SSIM_UNSET;
|
||||||
import static com.google.common.collect.Iterables.getLast;
|
import static com.google.common.collect.Iterables.getLast;
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ import androidx.media3.common.Format;
|
|||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
import androidx.media3.common.MimeTypes;
|
import androidx.media3.common.MimeTypes;
|
||||||
import androidx.media3.common.util.Util;
|
import androidx.media3.common.util.Util;
|
||||||
import androidx.media3.transformer.AndroidTestUtil;
|
import androidx.media3.transformer.AndroidTestUtil.AssetInfo;
|
||||||
import androidx.media3.transformer.DefaultEncoderFactory;
|
import androidx.media3.transformer.DefaultEncoderFactory;
|
||||||
import androidx.media3.transformer.EditedMediaItem;
|
import androidx.media3.transformer.EditedMediaItem;
|
||||||
import androidx.media3.transformer.Transformer;
|
import androidx.media3.transformer.Transformer;
|
||||||
@ -88,7 +87,7 @@ public class SsimMapperTest {
|
|||||||
|
|
||||||
// When running this test, input file list should be restricted more than this. Binary search can
|
// When running this test, input file list should be restricted more than this. Binary search can
|
||||||
// take up to 40 minutes to complete for a single clip on lower end devices.
|
// take up to 40 minutes to complete for a single clip on lower end devices.
|
||||||
private static final ImmutableList<String> INPUT_FILES =
|
private static final ImmutableList<AssetInfo> INPUT_ASSETS =
|
||||||
ImmutableList.of(
|
ImmutableList.of(
|
||||||
MP4_REMOTE_256W_144H_30_SECOND_ROOF_ONEPLUSNORD2_DOWNSAMPLED,
|
MP4_REMOTE_256W_144H_30_SECOND_ROOF_ONEPLUSNORD2_DOWNSAMPLED,
|
||||||
MP4_REMOTE_256W_144H_30_SECOND_ROOF_REDMINOTE9_DOWNSAMPLED,
|
MP4_REMOTE_256W_144H_30_SECOND_ROOF_REDMINOTE9_DOWNSAMPLED,
|
||||||
@ -117,11 +116,11 @@ public class SsimMapperTest {
|
|||||||
@Parameters
|
@Parameters
|
||||||
public static List<Object[]> parameters() {
|
public static List<Object[]> parameters() {
|
||||||
List<Object[]> parameterList = new ArrayList<>();
|
List<Object[]> parameterList = new ArrayList<>();
|
||||||
for (String file : INPUT_FILES) {
|
for (AssetInfo assetInfo : INPUT_ASSETS) {
|
||||||
parameterList.add(new Object[] {file, MimeTypes.VIDEO_H264});
|
parameterList.add(new Object[] {assetInfo, MimeTypes.VIDEO_H264});
|
||||||
// TODO(b/210593256): Test pre 24 once in-app muxing implemented.
|
// TODO(b/210593256): Test pre 24 once in-app muxing implemented.
|
||||||
if (Util.SDK_INT >= 24) {
|
if (Util.SDK_INT >= 24) {
|
||||||
parameterList.add(new Object[] {file, MimeTypes.VIDEO_H265});
|
parameterList.add(new Object[] {assetInfo, MimeTypes.VIDEO_H265});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return parameterList;
|
return parameterList;
|
||||||
@ -129,7 +128,7 @@ public class SsimMapperTest {
|
|||||||
|
|
||||||
@Parameter(0)
|
@Parameter(0)
|
||||||
@Nullable
|
@Nullable
|
||||||
public String fileUri;
|
public AssetInfo assetInfo;
|
||||||
|
|
||||||
@Parameter(1)
|
@Parameter(1)
|
||||||
@Nullable
|
@Nullable
|
||||||
@ -137,7 +136,6 @@ public class SsimMapperTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void findSsimMapping() throws Exception {
|
public void findSsimMapping() throws Exception {
|
||||||
String fileUri = checkNotNull(this.fileUri);
|
|
||||||
String mimeType = checkNotNull(this.mimeType);
|
String mimeType = checkNotNull(this.mimeType);
|
||||||
|
|
||||||
String testIdPrefix =
|
String testIdPrefix =
|
||||||
@ -147,11 +145,11 @@ public class SsimMapperTest {
|
|||||||
assumeFormatsSupported(
|
assumeFormatsSupported(
|
||||||
ApplicationProvider.getApplicationContext(),
|
ApplicationProvider.getApplicationContext(),
|
||||||
testIdPrefix + "_codecSupport",
|
testIdPrefix + "_codecSupport",
|
||||||
/* inputFormat= */ getFormatForTestFile(fileUri),
|
/* inputFormat= */ assetInfo.videoFormat,
|
||||||
/* outputFormat= */ null);
|
/* outputFormat= */ null);
|
||||||
|
|
||||||
new SsimBinarySearcher(
|
new SsimBinarySearcher(
|
||||||
ApplicationProvider.getApplicationContext(), testIdPrefix, fileUri, mimeType)
|
ApplicationProvider.getApplicationContext(), testIdPrefix, assetInfo, mimeType)
|
||||||
.search();
|
.search();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,18 +176,18 @@ public class SsimMapperTest {
|
|||||||
*
|
*
|
||||||
* @param context The {@link Context}.
|
* @param context The {@link Context}.
|
||||||
* @param testIdPrefix The test ID prefix.
|
* @param testIdPrefix The test ID prefix.
|
||||||
* @param videoUri The URI of the video to transform.
|
* @param assetInfo The video {@link AssetInfo} to transform.
|
||||||
* @param outputMimeType The video sample MIME type to output, see {@link
|
* @param outputMimeType The video sample MIME type to output, see {@link
|
||||||
* Transformer.Builder#setVideoMimeType}.
|
* Transformer.Builder#setVideoMimeType}.
|
||||||
*/
|
*/
|
||||||
public SsimBinarySearcher(
|
public SsimBinarySearcher(
|
||||||
Context context, String testIdPrefix, String videoUri, String outputMimeType) {
|
Context context, String testIdPrefix, AssetInfo assetInfo, String outputMimeType) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.testIdPrefix = testIdPrefix;
|
this.testIdPrefix = testIdPrefix;
|
||||||
this.videoUri = videoUri;
|
this.videoUri = assetInfo.uri;
|
||||||
this.outputMimeType = outputMimeType;
|
this.outputMimeType = outputMimeType;
|
||||||
exportsLeft = MAX_EXPORTS;
|
exportsLeft = MAX_EXPORTS;
|
||||||
format = AndroidTestUtil.getFormatForTestFile(videoUri);
|
format = assetInfo.videoFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,8 +20,7 @@ import static androidx.media3.test.utils.BitmapPixelTestUtil.MAXIMUM_AVERAGE_PIX
|
|||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.createArgb8888BitmapFromRgba8888Image;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.createArgb8888BitmapFromRgba8888Image;
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.getBitmapAveragePixelAbsoluteDifferenceArgb8888;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.getBitmapAveragePixelAbsoluteDifferenceArgb8888;
|
||||||
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmap;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
|
||||||
import static androidx.media3.transformer.mh.performance.PlaybackTestUtil.createTimestampOverlay;
|
import static androidx.media3.transformer.mh.performance.PlaybackTestUtil.createTimestampOverlay;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static com.google.common.truth.Truth.assertWithMessage;
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
@ -91,8 +90,8 @@ public class CompositionPlaybackTest {
|
|||||||
ConditionVariable hasRenderedFirstFrameCondition = new ConditionVariable();
|
ConditionVariable hasRenderedFirstFrameCondition = new ConditionVariable();
|
||||||
outputImageReader =
|
outputImageReader =
|
||||||
ImageReader.newInstance(
|
ImageReader.newInstance(
|
||||||
MP4_ASSET_FORMAT.width,
|
MP4_ASSET.videoFormat.width,
|
||||||
MP4_ASSET_FORMAT.height,
|
MP4_ASSET.videoFormat.height,
|
||||||
PixelFormat.RGBA_8888,
|
PixelFormat.RGBA_8888,
|
||||||
/* maxImages= */ 1);
|
/* maxImages= */ 1);
|
||||||
|
|
||||||
@ -110,11 +109,11 @@ public class CompositionPlaybackTest {
|
|||||||
|
|
||||||
player.setVideoSurface(
|
player.setVideoSurface(
|
||||||
outputImageReader.getSurface(),
|
outputImageReader.getSurface(),
|
||||||
new Size(MP4_ASSET_FORMAT.width, MP4_ASSET_FORMAT.height));
|
new Size(MP4_ASSET.videoFormat.width, MP4_ASSET.videoFormat.height));
|
||||||
player.setComposition(
|
player.setComposition(
|
||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setEffects(
|
.setEffects(
|
||||||
new Effects(
|
new Effects(
|
||||||
/* audioProcessors= */ ImmutableList.of(),
|
/* audioProcessors= */ ImmutableList.of(),
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
package androidx.media3.transformer.mh.performance;
|
package androidx.media3.transformer.mh.performance;
|
||||||
|
|
||||||
import static androidx.media3.common.util.Util.usToMs;
|
import static androidx.media3.common.util.Util.usToMs;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_DURATION_US;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
|
||||||
import static com.google.common.collect.Iterables.getLast;
|
import static com.google.common.collect.Iterables.getLast;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@ -131,7 +130,8 @@ public class CompositionPlayerSeekTest {
|
|||||||
// Plays the second video
|
// Plays the second video
|
||||||
.addAll(
|
.addAll(
|
||||||
Iterables.transform(
|
Iterables.transform(
|
||||||
MP4_ASSET_TIMESTAMPS_US, timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
MP4_ASSET_TIMESTAMPS_US,
|
||||||
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
// Seeked after the first playback ends, so the timestamps are repeated twice.
|
// Seeked after the first playback ends, so the timestamps are repeated twice.
|
||||||
ImmutableList<Long> expectedTimestampsUs =
|
ImmutableList<Long> expectedTimestampsUs =
|
||||||
@ -160,7 +160,8 @@ public class CompositionPlayerSeekTest {
|
|||||||
// Plays the second video
|
// Plays the second video
|
||||||
.addAll(
|
.addAll(
|
||||||
Iterables.transform(
|
Iterables.transform(
|
||||||
MP4_ASSET_TIMESTAMPS_US, timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
MP4_ASSET_TIMESTAMPS_US,
|
||||||
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> actualTimestampsUs =
|
ImmutableList<Long> actualTimestampsUs =
|
||||||
@ -188,7 +189,7 @@ public class CompositionPlayerSeekTest {
|
|||||||
.addAll(
|
.addAll(
|
||||||
Iterables.transform(
|
Iterables.transform(
|
||||||
Iterables.skip(MP4_ASSET_TIMESTAMPS_US, /* numberToSkip= */ 3),
|
Iterables.skip(MP4_ASSET_TIMESTAMPS_US, /* numberToSkip= */ 3),
|
||||||
timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> actualTimestampsUs =
|
ImmutableList<Long> actualTimestampsUs =
|
||||||
@ -214,13 +215,14 @@ public class CompositionPlayerSeekTest {
|
|||||||
.addAll(
|
.addAll(
|
||||||
Iterables.transform(
|
Iterables.transform(
|
||||||
Iterables.limit(MP4_ASSET_TIMESTAMPS_US, /* limitSize= */ 15),
|
Iterables.limit(MP4_ASSET_TIMESTAMPS_US, /* limitSize= */ 15),
|
||||||
timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
// Seek to the first, skipping the first three frames.
|
// Seek to the first, skipping the first three frames.
|
||||||
.addAll(Iterables.skip(MP4_ASSET_TIMESTAMPS_US, /* numberToSkip= */ 3))
|
.addAll(Iterables.skip(MP4_ASSET_TIMESTAMPS_US, /* numberToSkip= */ 3))
|
||||||
// Plays the second video
|
// Plays the second video
|
||||||
.addAll(
|
.addAll(
|
||||||
Iterables.transform(
|
Iterables.transform(
|
||||||
MP4_ASSET_TIMESTAMPS_US, timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
MP4_ASSET_TIMESTAMPS_US,
|
||||||
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> actualTimestampsUs =
|
ImmutableList<Long> actualTimestampsUs =
|
||||||
@ -236,7 +238,7 @@ public class CompositionPlayerSeekTest {
|
|||||||
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
PlayerTestListener listener = new PlayerTestListener(TEST_TIMEOUT_MS);
|
||||||
int numberOfFramesBeforeSeeking = 15;
|
int numberOfFramesBeforeSeeking = 15;
|
||||||
// Seek to the duration of the first video.
|
// Seek to the duration of the first video.
|
||||||
long seekTimeMs = usToMs(MP4_ASSET_DURATION_US);
|
long seekTimeMs = usToMs(MP4_ASSET.videoDurationUs);
|
||||||
|
|
||||||
ImmutableList<Long> expectedTimestampsUs =
|
ImmutableList<Long> expectedTimestampsUs =
|
||||||
new ImmutableList.Builder<Long>()
|
new ImmutableList.Builder<Long>()
|
||||||
@ -245,7 +247,8 @@ public class CompositionPlayerSeekTest {
|
|||||||
// Plays the second video
|
// Plays the second video
|
||||||
.addAll(
|
.addAll(
|
||||||
Iterables.transform(
|
Iterables.transform(
|
||||||
MP4_ASSET_TIMESTAMPS_US, timestampUs -> (MP4_ASSET_DURATION_US + timestampUs)))
|
MP4_ASSET_TIMESTAMPS_US,
|
||||||
|
timestampUs -> (MP4_ASSET.videoDurationUs + timestampUs)))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> actualTimestampsUs =
|
ImmutableList<Long> actualTimestampsUs =
|
||||||
@ -268,7 +271,7 @@ public class CompositionPlayerSeekTest {
|
|||||||
// Play the first 15 frames of the first video
|
// Play the first 15 frames of the first video
|
||||||
.addAll(Iterables.limit(MP4_ASSET_TIMESTAMPS_US, /* limitSize= */ 15))
|
.addAll(Iterables.limit(MP4_ASSET_TIMESTAMPS_US, /* limitSize= */ 15))
|
||||||
// Seeking to/beyond the end plays the last frame.
|
// Seeking to/beyond the end plays the last frame.
|
||||||
.add(MP4_ASSET_DURATION_US + getLast(MP4_ASSET_TIMESTAMPS_US))
|
.add(MP4_ASSET.videoDurationUs + getLast(MP4_ASSET_TIMESTAMPS_US))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
ImmutableList<Long> actualTimestampsUs =
|
ImmutableList<Long> actualTimestampsUs =
|
||||||
@ -279,9 +282,9 @@ public class CompositionPlayerSeekTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plays the {@link AndroidTestUtil#MP4_ASSET_URI_STRING} for {@code videoLoopCount} times, seeks
|
* Plays the {@link AndroidTestUtil#MP4_ASSET} for {@code videoLoopCount} times, seeks after
|
||||||
* after {@code numberOfFramesBeforeSeeking} frames to {@code seekTimeMs}, and returns the
|
* {@code numberOfFramesBeforeSeeking} frames to {@code seekTimeMs}, and returns the timestamps of
|
||||||
* timestamps of the processed frames, in microsecond.
|
* the processed frames, in microsecond.
|
||||||
*/
|
*/
|
||||||
private ImmutableList<Long> playCompositionOfTwoVideosAndGetTimestamps(
|
private ImmutableList<Long> playCompositionOfTwoVideosAndGetTimestamps(
|
||||||
PlayerTestListener listener, int numberOfFramesBeforeSeeking, long seekTimeMs)
|
PlayerTestListener listener, int numberOfFramesBeforeSeeking, long seekTimeMs)
|
||||||
@ -353,8 +356,8 @@ public class CompositionPlayerSeekTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static EditedMediaItem createEditedMediaItem(List<Effect> videoEffects) {
|
private static EditedMediaItem createEditedMediaItem(List<Effect> videoEffects) {
|
||||||
return new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET_URI_STRING))
|
return new EditedMediaItem.Builder(MediaItem.fromUri(MP4_ASSET.uri))
|
||||||
.setDurationUs(MP4_ASSET_DURATION_US)
|
.setDurationUs(MP4_ASSET.videoDurationUs)
|
||||||
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
.setEffects(new Effects(/* audioProcessors= */ ImmutableList.of(), videoEffects))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
package androidx.media3.transformer.mh.performance;
|
package androidx.media3.transformer.mh.performance;
|
||||||
|
|
||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@ -97,8 +97,8 @@ public class VideoCompositionPreviewPerformanceTest {
|
|||||||
player.setComposition(
|
player.setComposition(
|
||||||
new Composition.Builder(
|
new Composition.Builder(
|
||||||
new EditedMediaItemSequence(
|
new EditedMediaItemSequence(
|
||||||
getClippedEditedMediaItem(MP4_ASSET_URI_STRING, new Contrast(.2f)),
|
getClippedEditedMediaItem(MP4_ASSET.uri, new Contrast(.2f)),
|
||||||
getClippedEditedMediaItem(MP4_ASSET_URI_STRING, new Contrast(-.2f))))
|
getClippedEditedMediaItem(MP4_ASSET.uri, new Contrast(-.2f))))
|
||||||
.build());
|
.build());
|
||||||
player.prepare();
|
player.prepare();
|
||||||
});
|
});
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
package androidx.media3.transformer.mh.performance;
|
package androidx.media3.transformer.mh.performance;
|
||||||
|
|
||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING;
|
import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import android.app.Instrumentation;
|
import android.app.Instrumentation;
|
||||||
@ -80,7 +80,7 @@ public class VideoEffectsPreviewPerformanceTest {
|
|||||||
player.addAnalyticsListener(listener);
|
player.addAnalyticsListener(listener);
|
||||||
// Adding an EventLogger to use its log output in case the test fails.
|
// Adding an EventLogger to use its log output in case the test fails.
|
||||||
player.addAnalyticsListener(new EventLogger());
|
player.addAnalyticsListener(new EventLogger());
|
||||||
MediaItem mediaItem = getClippedMediaItem(MP4_ASSET_URI_STRING);
|
MediaItem mediaItem = getClippedMediaItem(MP4_ASSET.uri);
|
||||||
// Use the same media item so that format changes do not force exoplayer to re-init codecs
|
// Use the same media item so that format changes do not force exoplayer to re-init codecs
|
||||||
// between item transitions.
|
// between item transitions.
|
||||||
player.addMediaItems(ImmutableList.of(mediaItem, mediaItem, mediaItem, mediaItem));
|
player.addMediaItems(ImmutableList.of(mediaItem, mediaItem, mediaItem, mediaItem));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user