diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraph.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraph.java index f5f29add47..924f91dd8d 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraph.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioGraph.java @@ -46,7 +46,7 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicReference; /** Processes raw audio samples. */ -/* package */ final class AudioGraph implements SampleConsumer, OnMediaItemChangedListener { +/* package */ final class AudioGraph implements GraphInput { private static final int MAX_INPUT_BUFFER_COUNT = 10; private final AudioFormat outputAudioFormat; private final SilentAudioGenerator silentAudioGenerator; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java index 57fca918aa..a9fac0dab4 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java @@ -32,8 +32,9 @@ import androidx.media3.decoder.DecoderInputBuffer; import java.nio.ByteBuffer; import org.checkerframework.dataflow.qual.Pure; -/** Processes, re-encodes and muxes raw audio samples. */ +/** Processes, encodes and muxes raw audio samples. */ /* package */ final class AudioSampleExporter extends SampleExporter { + private static final int DEFAULT_ENCODER_BITRATE = 128 * 1024; private final Codec encoder; @@ -96,23 +97,8 @@ import org.checkerframework.dataflow.qual.Pure; } @Override - public void onMediaItemChanged( - EditedMediaItem editedMediaItem, - long durationUs, - @Nullable Format trackFormat, - boolean isLast) { - audioGraph.onMediaItemChanged(editedMediaItem, durationUs, trackFormat, isLast); - } - - @Override - @Nullable - public DecoderInputBuffer getInputBuffer() { - return audioGraph.getInputBuffer(); - } - - @Override - public boolean queueInputBuffer() { - return audioGraph.queueInputBuffer(); + public GraphInput getInput() { + return audioGraph; } @Override diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java index 0ef946561a..707024be11 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java @@ -28,7 +28,7 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicLong; /** Muxes encoded samples without any transcoding or transformation. */ -/* package */ final class EncodedSampleExporter extends SampleExporter { +/* package */ final class EncodedSampleExporter extends SampleExporter implements GraphInput { private static final int MAX_INPUT_BUFFER_COUNT = 10; @@ -88,6 +88,11 @@ import java.util.concurrent.atomic.AtomicLong; return true; } + @Override + public GraphInput getInput() { + return this; + } + @Override public void release() {} diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/GraphInput.java b/libraries/transformer/src/main/java/androidx/media3/transformer/GraphInput.java new file mode 100644 index 0000000000..76498683b5 --- /dev/null +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/GraphInput.java @@ -0,0 +1,20 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.media3.transformer; + +/** Represents one input stream to a processing graph. */ +/* package */ interface GraphInput extends SampleConsumer, OnMediaItemChangedListener {} diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java index ff8e37e3e4..287db5457a 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java @@ -38,14 +38,8 @@ import java.util.List; * Exporter that processes media data. * *

This exporter 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, long, Format, boolean) MediaItem} - * changes, and can be different from the thread used to call the other {@code SampleExporter} - * methods. */ -/* package */ abstract class SampleExporter implements SampleConsumer, OnMediaItemChangedListener { +/* package */ abstract class SampleExporter { private final MuxerWrapper muxerWrapper; private final @C.TrackType int outputTrackType; @@ -59,6 +53,17 @@ import java.util.List; outputTrackType = getProcessedTrackType(firstInputFormat.sampleMimeType); } + /** + * Returns an {@link GraphInput} to the underlying processing graph. + * + *

The {@link GraphInput} methods must be called from the same thread. This thread can change + * when the {@linkplain GraphInput#onMediaItemChanged MediaItem changes}, and can be different + * from the thread used to call the other {@link GraphInput} methods. All subsequent {@link + * GraphInput} method calls must be made from the thread on which {@link + * GraphInput#onMediaItemChanged} is called. + */ + public abstract GraphInput getInput(); + /** * Processes the input data and returns whether it may be possible to process more data by calling * this method again. 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 b81d13d8f3..8e15fda052 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -526,18 +526,20 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @C.TrackType int trackType = getProcessedTrackType(assetLoaderOutputFormat.sampleMimeType); AddedTrackInfo trackInfo = checkStateNotNull(addedTrackInfoByTrackType.get(trackType)); SampleExporter sampleExporter = getSampleExporter(assetLoaderOutputFormat, trackInfo); + GraphInput sampleExporterInput = sampleExporter.getInput(); OnMediaItemChangedListener onMediaItemChangedListener = (editedMediaItem, durationUs, trackFormat, isLast) -> { onMediaItemChanged(trackType, durationUs, isLast); - sampleExporter.onMediaItemChanged(editedMediaItem, durationUs, trackFormat, isLast); + sampleExporterInput.onMediaItemChanged( + editedMediaItem, durationUs, trackFormat, isLast); }; sequenceAssetLoaders .get(sequenceIndex) .addOnMediaItemChangedListener(onMediaItemChangedListener, trackType); internalHandler.obtainMessage(MSG_REGISTER_SAMPLE_EXPORTER, sampleExporter).sendToTarget(); - return sampleExporter; + return sampleExporterInput; } @Override diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java index 1de4302d07..7d08abf4ad 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java @@ -64,8 +64,9 @@ import java.util.concurrent.atomic.AtomicLong; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.dataflow.qual.Pure; -/** Processes, re-encodes and muxes raw video frames. */ -/* package */ final class VideoSampleExporter extends SampleExporter { +// TODO: b/289986435 - Remove implementations of GraphInput after creating VideoGraph. +/** Processes, encodes and muxes raw video frames. */ +/* package */ final class VideoSampleExporter extends SampleExporter implements GraphInput { private static final String TAG = "VideoSampleExporter"; private final AtomicLong mediaItemOffsetUs; @@ -266,6 +267,11 @@ import org.checkerframework.dataflow.qual.Pure; videoFrameProcessor.signalEndOfInput(); } + @Override + public GraphInput getInput() { + return this; + } + @Override public void release() { videoFrameProcessor.release();