From bd0d61d80d7561d2eb0850920d52357496b83e4f Mon Sep 17 00:00:00 2001 From: kimvde Date: Tue, 3 Jan 2023 09:47:47 +0000 Subject: [PATCH] Misc small fixes - Improve AssetLoader Javadoc - Fix Javadoc of sample pipelines - Improve Javadoc of Transformer.startTransformation - Move thread hops for Transformer listener callbacks to TransformerInternal PiperOrigin-RevId: 499156604 --- .../media3/transformer/AssetLoader.java | 8 --- .../AudioTranscodingSamplePipeline.java | 4 +- .../ExoPlayerAssetLoaderRenderer.java | 2 +- .../PassthroughSamplePipeline.java | 2 +- .../media3/transformer/SamplePipeline.java | 2 +- .../media3/transformer/Transformer.java | 49 ++++++++----------- .../transformer/TransformerInternal.java | 14 ++++-- 7 files changed, 36 insertions(+), 45 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 d3e2996a78..87413ed229 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AssetLoader.java @@ -123,14 +123,6 @@ public interface AssetLoader { /** * A listener of {@link AssetLoader} events. * - *

This listener is typically used in the following way: - * - *

- * *

This listener can be called from any thread. */ interface Listener { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java index 4077f836ce..54dc8ce39c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioTranscodingSamplePipeline.java @@ -35,9 +35,7 @@ import java.util.List; import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.dataflow.qual.Pure; -/** - * Pipeline to decode audio samples, apply audio processing to the raw samples, and re-encode them. - */ +/** Pipeline to apply audio processing to raw audio samples, encode them and mux them. */ /* package */ final class AudioTranscodingSamplePipeline extends BaseSamplePipeline { private static final int DEFAULT_ENCODER_BITRATE = 128 * 1024; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java index 6aedbaea0b..c4531d2b23 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoaderRenderer.java @@ -248,7 +248,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } /** - * Attempts to read input data and pass the input data to the sample pipeline. + * Attempts to read input data and pass it to the sample pipeline. * * @return Whether it may be possible to read more data immediately by calling this method again. */ diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/PassthroughSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/PassthroughSamplePipeline.java index 722bfc751c..98a55de731 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/PassthroughSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/PassthroughSamplePipeline.java @@ -20,7 +20,7 @@ import androidx.annotation.Nullable; import androidx.media3.common.Format; import androidx.media3.decoder.DecoderInputBuffer; -/** Pipeline that passes through the samples without any re-encoding or transformation. */ +/** Pipeline that muxes encoded samples without any transcoding or transformation. */ /* package */ final class PassthroughSamplePipeline extends BaseSamplePipeline { private final DecoderInputBuffer buffer; 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 e33c79ad52..2aeb683742 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java @@ -21,7 +21,7 @@ import androidx.media3.common.util.UnstableApi; import androidx.media3.decoder.DecoderInputBuffer; /** - * Pipeline for processing {@link DecoderInputBuffer DecoderInputBuffers}. + * Pipeline for processing media data. * *

This pipeline can be used to implement transformations of audio or video samples. */ diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java index 338e990f0e..dc5ce658b3 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -43,7 +43,6 @@ import androidx.media3.effect.GlEffect; import androidx.media3.effect.GlEffectsFrameProcessor; import androidx.media3.effect.GlMatrixTransformation; import androidx.media3.exoplayer.audio.SonicAudioProcessor; -import androidx.media3.exoplayer.source.MediaSource; import com.google.common.collect.ImmutableList; import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.lang.annotation.Documented; @@ -695,8 +694,10 @@ public final class Transformer { * *

Concurrent transformations on the same Transformer object are not allowed. * - *

The output is an MP4 file. It can contain at most one video track and one audio track. Other - * track types are ignored. For adaptive bitrate {@linkplain MediaSource media sources}, the + *

If no custom {@link Muxer.Factory} is specified, the output is an MP4 file. + * + *

The output can contain at most one video track and one audio track. Other track types are + * ignored. For adaptive bitrate, if no custom {@link AssetLoader.Factory} is specified, the * highest bitrate video and audio streams are selected. * * @param mediaItem The {@link MediaItem} to transform. @@ -718,8 +719,10 @@ public final class Transformer { * *

Concurrent transformations on the same Transformer object are not allowed. * - *

The output is an MP4 file. It can contain at most one video track and one audio track. Other - * track types are ignored. For adaptive bitrate {@linkplain MediaSource media sources}, the + *

If no custom {@link Muxer.Factory} is specified, the output is an MP4 file. + * + *

The output can contain at most one video track and one audio track. Other track types are + * ignored. For adaptive bitrate, if no custom {@link AssetLoader.Factory} is specified, the * highest bitrate video and audio streams are selected. * * @param mediaItem The {@link MediaItem} to transform. @@ -753,12 +756,9 @@ public final class Transformer { } TransformerInternalListener transformerInternalListener = new TransformerInternalListener(mediaItem); + HandlerWrapper applicationHandler = clock.createHandler(looper, /* callback= */ null); FallbackListener fallbackListener = - new FallbackListener( - mediaItem, - listeners, - clock.createHandler(looper, /* callback= */ null), - transformationRequest); + new FallbackListener(mediaItem, listeners, applicationHandler, transformationRequest); transformerInternal = new TransformerInternal( context, @@ -778,6 +778,7 @@ public final class Transformer { muxerFactory, transformerInternalListener, fallbackListener, + applicationHandler, debugViewProvider, clock); transformerInternal.start(); @@ -836,37 +837,29 @@ public final class Transformer { private final class TransformerInternalListener implements TransformerInternal.Listener { private final MediaItem mediaItem; - private final HandlerWrapper handler; public TransformerInternalListener(MediaItem mediaItem) { this.mediaItem = mediaItem; - handler = clock.createHandler(looper, /* callback= */ null); } @Override public void onTransformationCompleted(TransformationResult transformationResult) { // TODO(b/213341814): Add event flags for Transformer events. - handler.post( - () -> { - transformerInternal = null; - listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, - listener -> listener.onTransformationCompleted(mediaItem, transformationResult)); - listeners.flushEvents(); - }); + transformerInternal = null; + listeners.queueEvent( + /* eventFlag= */ C.INDEX_UNSET, + listener -> listener.onTransformationCompleted(mediaItem, transformationResult)); + listeners.flushEvents(); } @Override public void onTransformationError( TransformationResult result, TransformationException exception) { - handler.post( - () -> { - transformerInternal = null; - listeners.queueEvent( - /* eventFlag= */ C.INDEX_UNSET, - listener -> listener.onTransformationError(mediaItem, result, exception)); - listeners.flushEvents(); - }); + transformerInternal = null; + listeners.queueEvent( + /* eventFlag= */ C.INDEX_UNSET, + listener -> listener.onTransformationError(mediaItem, result, exception)); + listeners.flushEvents(); } } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java index 0a0fc2517e..54106b4501 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -100,6 +100,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private final CapturingEncoderFactory encoderFactory; private final FrameProcessor.Factory frameProcessorFactory; private final Listener listener; + private final HandlerWrapper applicationHandler; private final DebugViewProvider debugViewProvider; private final Clock clock; private final HandlerThread internalHandlerThread; @@ -137,6 +138,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; Muxer.Factory muxerFactory, Listener listener, FallbackListener fallbackListener, + HandlerWrapper applicationHandler, DebugViewProvider debugViewProvider, Clock clock) { this.context = context; @@ -148,6 +150,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; this.encoderFactory = new CapturingEncoderFactory(encoderFactory); this.frameProcessorFactory = frameProcessorFactory; this.listener = listener; + this.applicationHandler = applicationHandler; this.debugViewProvider = debugViewProvider; this.clock = clock; internalHandlerThread = new HandlerThread("Transformer:Internal"); @@ -349,10 +352,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } if (exception != null) { - listener.onTransformationError( - transformationResultBuilder.setTransformationException(exception).build(), exception); + TransformationException finalException = exception; + applicationHandler.post( + () -> + listener.onTransformationError( + transformationResultBuilder.setTransformationException(finalException).build(), + finalException)); } else { - listener.onTransformationCompleted(transformationResultBuilder.build()); + applicationHandler.post( + () -> listener.onTransformationCompleted(transformationResultBuilder.build())); } }