From bede06546d530170efd1b8a5b9f3ff3b314dbe62 Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 22 Feb 2023 15:37:53 +0000 Subject: [PATCH] Restrict SampleConsumer and OnMediaItemChanged threading This is more future-proof because it is likely to simplify the upcoming changes to the sample pipelines. PiperOrigin-RevId: 511492014 --- .../media3/transformer/AssetLoader.java | 24 +++++++++++++------ .../transformer/EncodedSamplePipeline.java | 3 ++- .../OnMediaItemChangedListener.java | 2 -- .../media3/transformer/SampleConsumer.java | 6 +---- .../media3/transformer/SamplePipeline.java | 5 ++++ 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java index b601605d91..5a17090c6b 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java @@ -66,17 +66,21 @@ public interface AssetLoader { EditedMediaItem editedMediaItem, Looper looper, Listener listener); } - /** - * A listener of {@link AssetLoader} events. - * - *

This listener can be called from any thread. - */ + /** A listener of {@link AssetLoader} events. */ interface Listener { - /** Called when the duration of the input media is known. */ + /** + * Called when the duration of the input media is known. + * + *

Can be called from any thread. + */ void onDurationUs(long durationUs); - /** Called when the number of tracks output by the asset loader is known. */ + /** + * Called when the number of tracks output by the asset loader is known. + * + *

Can be called from any thread. + */ void onTrackCount(@IntRange(from = 1) int trackCount); /** @@ -87,6 +91,10 @@ public interface AssetLoader { * *

Must be called once per {@linkplain #onTrackCount(int) declared} track. * + *

Must be called from the thread that will be used to call the returned {@link + * SampleConsumer}'s methods. This thread is generally different from the one used to access the + * {@link AssetLoader} methods. + * * @param format The {@link Format} of the input media (prior to video slow motion flattening or * to decoding). * @param supportedOutputTypes The output {@linkplain SupportedOutputTypes types} supported by @@ -109,6 +117,8 @@ public interface AssetLoader { /** * Called if an error occurs in the asset loader. In this case, the asset loader will be * {@linkplain #release() released} automatically. + * + *

Can be called from any thread. */ void onError(ExportException exportException); } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSamplePipeline.java index fc99c08e41..9663e390a1 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSamplePipeline.java @@ -37,7 +37,8 @@ import java.util.concurrent.atomic.AtomicLong; private final Queue availableInputBuffers; private final Queue pendingInputBuffers; - private volatile long mediaItemOffsetUs; + private long mediaItemOffsetUs; + private volatile boolean inputEnded; public EncodedSamplePipeline( diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/OnMediaItemChangedListener.java b/libraries/transformer/src/main/java/androidx/media3/transformer/OnMediaItemChangedListener.java index cd668e2e82..33c2b35d1c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/OnMediaItemChangedListener.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/OnMediaItemChangedListener.java @@ -26,8 +26,6 @@ import androidx.media3.common.MediaItem; * Called when the {@link MediaItem} whose samples are passed to the {@link SamplePipeline} * changes. * - *

Can be called from any thread. - * * @param editedMediaItem The {@link MediaItem} with the transformations to apply to it. * @param durationUs The duration of the {@link MediaItem}, in microseconds. * @param trackFormat The {@link Format} of the {@link MediaItem} track corresponding to the diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SampleConsumer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SampleConsumer.java index 0fffea6c25..f46dfa5512 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SampleConsumer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SampleConsumer.java @@ -22,11 +22,7 @@ import androidx.media3.common.ColorInfo; import androidx.media3.common.util.UnstableApi; import androidx.media3.decoder.DecoderInputBuffer; -/** - * Consumer of encoded media samples, raw audio or raw video frames. - * - *

All the methods in this class can be called from any thread. - */ +/** Consumer of encoded media samples, raw audio or raw video frames. */ @UnstableApi public interface SampleConsumer { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java index adf6140358..c630e0d2e9 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java @@ -36,6 +36,11 @@ import java.util.List; * Pipeline for processing media data. * *

This pipeline can be used to implement transformations of audio or video samples. + * + *

The {@link SampleConsumer} and {@link OnMediaItemChangedListener} methods must be called from + * the same thread. This thread can change when the {@link + * OnMediaItemChangedListener#onMediaItemChanged(EditedMediaItem, Format, long) MediaItem} changes, + * and can be different from the thread used to call the other {@code SamplePipeline} methods. */ /* package */ abstract class SamplePipeline implements SampleConsumer, OnMediaItemChangedListener {