From 766ff44a2ca3ada05dd633c53038b11f354e69a9 Mon Sep 17 00:00:00 2001 From: Luyuan Chen Date: Tue, 5 Mar 2024 14:05:27 +0000 Subject: [PATCH] Fix review comment --- .../androidx/media3/common/VideoGraph.java | 14 +++-- .../media3/effect/DefaultVideoCompositor.java | 56 ++++++++++--------- .../effect/MultipleInputVideoGraph.java | 20 ++++--- .../PreviewingSingleInputVideoGraph.java | 2 +- .../media3/effect/SingleInputVideoGraph.java | 18 ++++-- .../media3/effect/VideoCompositor.java | 19 ++++--- .../video/CompositingVideoSinkProvider.java | 7 +-- .../DefaultVideoCompositorPixelTest.java | 13 +++-- .../transformer/AudioSampleExporter.java | 2 +- .../transformer/EncodedSampleExporter.java | 2 +- .../media3/transformer/SampleExporter.java | 4 +- .../TransformerMultipleInputVideoGraph.java | 6 +- .../TransformerSingleInputVideoGraph.java | 6 +- .../transformer/TransformerVideoGraph.java | 4 +- .../transformer/VideoSampleExporter.java | 18 +++--- 15 files changed, 108 insertions(+), 83 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/VideoGraph.java b/libraries/common/src/main/java/androidx/media3/common/VideoGraph.java index 537c9f0cb6..440a526352 100644 --- a/libraries/common/src/main/java/androidx/media3/common/VideoGraph.java +++ b/libraries/common/src/main/java/androidx/media3/common/VideoGraph.java @@ -16,6 +16,7 @@ package androidx.media3.common; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.media3.common.util.UnstableApi; @@ -73,20 +74,23 @@ public interface VideoGraph { *

A underlying processing {@link VideoFrameProcessor} is created every time this method is * called. * + *

All inputs must be registered before rendering frames to the underlying + * {@link #getProcessor(int) VideoFrameProcessor}. + * *

If the method throws, the caller must call {@link #release}. * - * @param sequenceIndex The sequence index of the input which can aid ordering of the inputs. The - * index must start from 0. + * @param inputIndex The index of the input which could be used to order the inputs. + * The index must start from 0. */ - void registerInput(int sequenceIndex) throws VideoFrameProcessingException; + void registerInput(@IntRange(from = 0) int inputIndex) throws VideoFrameProcessingException; /** * Returns the {@link VideoFrameProcessor} that handles the processing for an input registered via - * {@link #registerInput(int)}. If the {@code sequenceIndex} is not {@linkplain + * {@link #registerInput(int)}. If the {@code inputIndex} is not {@linkplain * #registerInput(int) registered} before, this method will throw an {@link * IllegalStateException}. */ - VideoFrameProcessor getProcessor(int sequenceIndex); + VideoFrameProcessor getProcessor(int inputIndex); /** * Sets the output surface and supporting information. diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java index 7a47951572..d390b8e887 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java @@ -18,6 +18,7 @@ package androidx.media3.effect; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.common.util.Util.contains; import static java.lang.Math.abs; import static java.lang.Math.max; @@ -78,7 +79,8 @@ public final class DefaultVideoCompositor implements VideoCompositor { private static final String THREAD_NAME = "Effect:DefaultVideoCompositor:GlThread"; private static final String TAG = "DefaultVideoCompositor"; - private static final int PRIMARY_INPUT_ID = 0; + // TODO: b/338579287: Use the first registered index instead of a constant value. + private static final int PRIMARY_INPUT_INDEX = 0; private final VideoCompositor.Listener listener; private final GlTextureProducer.Listener textureOutputListener; @@ -142,24 +144,26 @@ public final class DefaultVideoCompositor implements VideoCompositor { } @Override - public synchronized void registerInputSource(int sequenceIndex) { - inputSources.put(sequenceIndex, new InputSource()); + public synchronized void registerInputSource(@IntRange(from = 0) int inputIndex) { + checkState(!contains(inputSources, inputIndex)); + inputSources.put(inputIndex, new InputSource()); } @Override - public synchronized void signalEndOfInputSource(int inputId) { - inputSources.get(inputId).isInputEnded = true; + public synchronized void signalEndOfInputSource(int inputIndex) { + checkState(contains(inputSources, inputIndex)); + inputSources.get(inputIndex).isInputEnded = true; boolean allInputsEnded = true; for (int i = 0; i < inputSources.size(); i++) { - if (!inputSources.get(inputSources.keyAt(i)).isInputEnded) { + if (!inputSources.valueAt(i).isInputEnded) { allInputsEnded = false; break; } } this.allInputsEnded = allInputsEnded; - if (inputSources.get(PRIMARY_INPUT_ID).frameInfos.isEmpty()) { - if (inputId == PRIMARY_INPUT_ID) { + if (inputSources.get(PRIMARY_INPUT_INDEX).frameInfos.isEmpty()) { + if (inputIndex == PRIMARY_INPUT_INDEX) { releaseExcessFramesInAllSecondaryStreams(); } if (allInputsEnded) { @@ -167,7 +171,8 @@ public final class DefaultVideoCompositor implements VideoCompositor { return; } } - if (inputId != PRIMARY_INPUT_ID && inputSources.get(inputId).frameInfos.size() == 1) { + if (inputIndex != PRIMARY_INPUT_INDEX + && inputSources.get(inputIndex).frameInfos.size() == 1) { // When a secondary stream ends input, composite if there was only one pending frame in the // stream. videoFrameProcessingTaskExecutor.submit(this::maybeComposite); @@ -176,12 +181,13 @@ public final class DefaultVideoCompositor implements VideoCompositor { @Override public synchronized void queueInputTexture( - int inputId, + int inputIndex, GlTextureProducer textureProducer, GlTextureInfo inputTexture, ColorInfo colorInfo, long presentationTimeUs) { - InputSource inputSource = inputSources.get(inputId); + checkState(contains(inputSources, inputIndex)); + InputSource inputSource = inputSources.get(inputIndex); checkState(!inputSource.isInputEnded); checkStateNotNull(!ColorInfo.isTransferHdr(colorInfo), "HDR input is not supported."); if (configuredColorInfo == null) { @@ -195,10 +201,10 @@ public final class DefaultVideoCompositor implements VideoCompositor { textureProducer, inputTexture, presentationTimeUs, - settings.getOverlaySettings(inputId, presentationTimeUs)); + settings.getOverlaySettings(inputIndex, presentationTimeUs)); inputSource.frameInfos.add(inputFrameInfo); - if (inputId == PRIMARY_INPUT_ID) { + if (inputIndex == PRIMARY_INPUT_INDEX) { releaseExcessFramesInAllSecondaryStreams(); } else { releaseExcessFramesInSecondaryStream(inputSource); @@ -224,11 +230,11 @@ public final class DefaultVideoCompositor implements VideoCompositor { } private synchronized void releaseExcessFramesInAllSecondaryStreams() { - for (int i = 0; i < inputSources.size(); i++) { - if (i == PRIMARY_INPUT_ID) { + for (int inputIndex = 0; inputIndex < inputSources.size(); inputIndex++) { + if (inputIndex == PRIMARY_INPUT_INDEX) { continue; } - releaseExcessFramesInSecondaryStream(inputSources.get(inputSources.keyAt(i))); + releaseExcessFramesInSecondaryStream(inputSources.valueAt(inputIndex)); } } @@ -240,7 +246,7 @@ public final class DefaultVideoCompositor implements VideoCompositor { * began. */ private synchronized void releaseExcessFramesInSecondaryStream(InputSource secondaryInputSource) { - InputSource primaryInputSource = inputSources.get(PRIMARY_INPUT_ID); + InputSource primaryInputSource = inputSources.get(PRIMARY_INPUT_INDEX); // If the primary stream output is ended, all secondary frames can be released. if (primaryInputSource.frameInfos.isEmpty() && primaryInputSource.isInputEnded) { releaseFrames( @@ -291,7 +297,7 @@ public final class DefaultVideoCompositor implements VideoCompositor { return; } - InputFrameInfo primaryInputFrame = framesToComposite.get(PRIMARY_INPUT_ID); + InputFrameInfo primaryInputFrame = framesToComposite.get(PRIMARY_INPUT_INDEX); ImmutableList.Builder inputSizes = new ImmutableList.Builder<>(); for (int i = 0; i < framesToComposite.size(); i++) { @@ -312,7 +318,7 @@ public final class DefaultVideoCompositor implements VideoCompositor { textureOutputListener.onTextureRendered( /* textureProducer= */ this, outputTexture, outputPresentationTimestampUs, syncObject); - InputSource primaryInputSource = inputSources.get(PRIMARY_INPUT_ID); + InputSource primaryInputSource = inputSources.get(PRIMARY_INPUT_INDEX); releaseFrames(primaryInputSource, /* numberOfFramesToRelease= */ 1); releaseExcessFramesInAllSecondaryStreams(); @@ -332,18 +338,18 @@ public final class DefaultVideoCompositor implements VideoCompositor { if (outputTexturePool.freeTextureCount() == 0) { return ImmutableList.of(); } - for (int inputId = 0; inputId < inputSources.size(); inputId++) { - if (inputSources.get(inputSources.keyAt(inputId)).frameInfos.isEmpty()) { + for (int i = 0; i < inputSources.size(); i++) { + if (inputSources.valueAt(i).frameInfos.isEmpty()) { return ImmutableList.of(); } } ImmutableList.Builder framesToComposite = new ImmutableList.Builder<>(); InputFrameInfo primaryFrameToComposite = - inputSources.get(PRIMARY_INPUT_ID).frameInfos.element(); + inputSources.get(PRIMARY_INPUT_INDEX).frameInfos.element(); framesToComposite.add(primaryFrameToComposite); - for (int inputId = 0; inputId < inputSources.size(); inputId++) { - if (inputId == PRIMARY_INPUT_ID) { + for (int i = 0; i < inputSources.size(); i++) { + if (i == PRIMARY_INPUT_INDEX) { continue; } // Select the secondary streams' frame that would be composited next. The frame selected is @@ -352,7 +358,7 @@ public final class DefaultVideoCompositor implements VideoCompositor { // 2. Two or more frames, and at least one frame has timestamp greater than the target // timestamp. // The smaller timestamp is taken if two timestamps have the same distance from the primary. - InputSource secondaryInputSource = inputSources.get(inputSources.keyAt(inputId)); + InputSource secondaryInputSource = inputSources.valueAt(i); if (secondaryInputSource.frameInfos.size() == 1 && !secondaryInputSource.isInputEnded) { return ImmutableList.of(); } diff --git a/libraries/effect/src/main/java/androidx/media3/effect/MultipleInputVideoGraph.java b/libraries/effect/src/main/java/androidx/media3/effect/MultipleInputVideoGraph.java index f4f86653ba..491572da96 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/MultipleInputVideoGraph.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/MultipleInputVideoGraph.java @@ -33,6 +33,7 @@ import android.opengl.EGLContext; import android.opengl.EGLDisplay; import android.opengl.EGLSurface; import android.util.SparseArray; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.ColorInfo; @@ -211,9 +212,10 @@ public abstract class MultipleInputVideoGraph implements VideoGraph { } @Override - public void registerInput(int sequenceIndex) throws VideoFrameProcessingException { - checkStateNotNull(videoCompositor); - videoCompositor.registerInputSource(sequenceIndex); + public void registerInput(@IntRange(from = 0) int inputIndex) + throws VideoFrameProcessingException { + checkState(!contains(preProcessors, inputIndex)); + checkNotNull(videoCompositor).registerInputSource(inputIndex); // Creating a new VideoFrameProcessor for the input. VideoFrameProcessor preProcessor = videoFrameProcessorFactory @@ -222,7 +224,7 @@ public abstract class MultipleInputVideoGraph implements VideoGraph { // Texture output to compositor. (textureProducer, texture, presentationTimeUs, syncObject) -> queuePreProcessingOutputToCompositor( - sequenceIndex, textureProducer, texture, presentationTimeUs), + inputIndex, textureProducer, texture, presentationTimeUs), PRE_COMPOSITOR_TEXTURE_OUTPUT_CAPACITY) .build() .create( @@ -253,16 +255,16 @@ public abstract class MultipleInputVideoGraph implements VideoGraph { @Override public void onEnded() { - onPreProcessingVideoFrameProcessorEnded(sequenceIndex); + onPreProcessingVideoFrameProcessorEnded(inputIndex); } }); - preProcessors.put(sequenceIndex, preProcessor); + preProcessors.put(inputIndex, preProcessor); } @Override - public VideoFrameProcessor getProcessor(int sequenceIndex) { - checkState(contains(preProcessors, sequenceIndex)); - return preProcessors.get(sequenceIndex); + public VideoFrameProcessor getProcessor(int inputIndex) { + checkState(contains(preProcessors, inputIndex)); + return preProcessors.get(inputIndex); } @Override diff --git a/libraries/effect/src/main/java/androidx/media3/effect/PreviewingSingleInputVideoGraph.java b/libraries/effect/src/main/java/androidx/media3/effect/PreviewingSingleInputVideoGraph.java index d6edae887e..8998831524 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/PreviewingSingleInputVideoGraph.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/PreviewingSingleInputVideoGraph.java @@ -109,6 +109,6 @@ public final class PreviewingSingleInputVideoGraph extends SingleInputVideoGraph @Override public void renderOutputFrame(long renderTimeNs) { - getProcessor(SINGLE_INPUT_INDEX).renderOutputFrame(renderTimeNs); + getProcessor(getInputIndex()).renderOutputFrame(renderTimeNs); } } diff --git a/libraries/effect/src/main/java/androidx/media3/effect/SingleInputVideoGraph.java b/libraries/effect/src/main/java/androidx/media3/effect/SingleInputVideoGraph.java index 31520c47ae..9328eab27f 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/SingleInputVideoGraph.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/SingleInputVideoGraph.java @@ -16,11 +16,13 @@ package androidx.media3.effect; +import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkStateNotNull; import android.content.Context; import androidx.annotation.Nullable; +import androidx.media3.common.C; import androidx.media3.common.ColorInfo; import androidx.media3.common.DebugViewProvider; import androidx.media3.common.Effect; @@ -38,9 +40,6 @@ import java.util.concurrent.Executor; @UnstableApi public abstract class SingleInputVideoGraph implements VideoGraph { - /** The index of the only {@linkplain #registerInput(int) registered} input. */ - public static final int SINGLE_INPUT_INDEX = 0; - private final Context context; private final VideoFrameProcessor.Factory videoFrameProcessorFactory; private final ColorInfo outputColorInfo; @@ -56,6 +55,7 @@ public abstract class SingleInputVideoGraph implements VideoGraph { private boolean isEnded; private boolean released; private volatile boolean hasProducedFrameWithTimestampZero; + private int inputIndex; /** * Creates an instance. @@ -86,6 +86,7 @@ public abstract class SingleInputVideoGraph implements VideoGraph { this.renderFramesAutomatically = renderFramesAutomatically; this.presentation = presentation; this.initialTimestampOffsetUs = initialTimestampOffsetUs; + this.inputIndex = C.INDEX_UNSET; } /** @@ -99,9 +100,11 @@ public abstract class SingleInputVideoGraph implements VideoGraph { } @Override - public void registerInput(int sequenceIndex) throws VideoFrameProcessingException { + public void registerInput(int inputIndex) throws VideoFrameProcessingException { checkStateNotNull(videoFrameProcessor == null && !released); + checkState(this.inputIndex == C.INDEX_UNSET); + this.inputIndex = inputIndex; videoFrameProcessor = videoFrameProcessorFactory.create( context, @@ -162,7 +165,8 @@ public abstract class SingleInputVideoGraph implements VideoGraph { } @Override - public VideoFrameProcessor getProcessor(int sequenceIndex) { + public VideoFrameProcessor getProcessor(int inputIndex) { + checkArgument(this.inputIndex != C.INDEX_UNSET && this.inputIndex == inputIndex); return checkStateNotNull(videoFrameProcessor); } @@ -192,6 +196,10 @@ public abstract class SingleInputVideoGraph implements VideoGraph { released = true; } + protected int getInputIndex() { + return inputIndex; + } + protected long getInitialTimestampOffsetUs() { return initialTimestampOffsetUs; } diff --git a/libraries/effect/src/main/java/androidx/media3/effect/VideoCompositor.java b/libraries/effect/src/main/java/androidx/media3/effect/VideoCompositor.java index 365f41446e..e128ccd252 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/VideoCompositor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/VideoCompositor.java @@ -15,6 +15,7 @@ */ package androidx.media3.effect; +import androidx.annotation.IntRange; import androidx.media3.common.ColorInfo; import androidx.media3.common.GlTextureInfo; import androidx.media3.common.VideoFrameProcessingException; @@ -48,29 +49,33 @@ public interface VideoCompositor extends GlTextureProducer { /** * Registers a new input source. * - * @param sequenceIndex The sequence index of the input source which is used to determine the - * order of the input sources. The same index should to be used in {@link #queueInputTexture}. + * @param inputIndex The index of the input source which could be used to determine the order of + * the input sources. The same index should to be used in {@link #queueInputTexture}. The + * index must start from 0. All inputs must be registered before + * {@linkplain #queueInputTexture(int, GlTextureProducer, GlTextureInfo, ColorInfo, long) queueing} + * textures. */ - void registerInputSource(int sequenceIndex); + void registerInputSource(@IntRange(from = 0) int inputIndex); /** * Signals that no more frames will come from the upstream {@link GlTextureProducer.Listener}. * - * @param inputId The identifier for an input source, returned from {@link #registerInputSource}. + * @param inputIndex The index of the input source. */ - void signalEndOfInputSource(int inputId); + void signalEndOfInputSource(int inputIndex); /** * Queues an input texture to be composited. * - * @param inputId The identifier for an input source, returned from {@link #registerInputSource}. + * @param inputIndex The index of the input source, the same index used when {@linkplain + * #registerInputSource(int) registering the input source}. * @param textureProducer The source from where the {@code inputTexture} is produced. * @param inputTexture The {@link GlTextureInfo} to composite. * @param colorInfo The {@link ColorInfo} of {@code inputTexture}. * @param presentationTimeUs The presentation time of {@code inputTexture}, in microseconds. */ void queueInputTexture( - int inputId, + int inputIndex, GlTextureProducer textureProducer, GlTextureInfo inputTexture, ColorInfo colorInfo, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java index b9a043136a..5e468015d4 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java @@ -419,7 +419,6 @@ public final class CompositingVideoSinkProvider outputColorInfo = inputColorInfo.buildUpon().setColorTransfer(C.COLOR_TRANSFER_ST2084).build(); } - int videoGraphInputId; try { videoGraph = previewingVideoGraphFactory.create( @@ -435,12 +434,12 @@ public final class CompositingVideoSinkProvider Size size = currentSurfaceAndSize.second; maybeSetOutputSurfaceInfo(surface, size.getWidth(), size.getHeight()); } - videoGraphInputId = videoGraph.registerInput(); + videoGraph.registerInput(/* inputIndex= */ 0); } catch (VideoFrameProcessingException e) { throw new VideoSink.VideoSinkException(e, sourceFormat); } state = STATE_INITIALIZED; - return videoGraph.getProcessor(videoGraphInputId); + return videoGraph.getProcessor(/* inputIndex= */ 0); } private boolean isInitialized() { @@ -550,8 +549,6 @@ public final class CompositingVideoSinkProvider // reduces decoder timeouts, and consider restoring. videoFrameProcessorMaxPendingFrameCount = Util.getMaxPendingFramesCountForMediaCodecDecoders(context); - videoGraph.registerInput(/* sequenceIndex= */ 0); - videoFrameProcessor = videoGraph.getProcessor(/* sequenceIndex= */ 0); videoEffects = new ArrayList<>(); finalBufferPresentationTimeUs = C.TIME_UNSET; diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java index 8c9442235d..76094d0144 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java @@ -744,7 +744,8 @@ public final class DefaultVideoCompositorPixelTest { textureBitmapReader, videoCompositor, sharedExecutorService, - glObjectsProvider) + glObjectsProvider, + /* inputIndex= */ i) .setEffects(effectsToApply.build()) .build(); inputVideoFrameProcessorTestRunners.add(vfpTestRunner); @@ -855,9 +856,9 @@ public final class DefaultVideoCompositorPixelTest { TextureBitmapReader textureBitmapReader, VideoCompositor videoCompositor, @Nullable ExecutorService executorService, - GlObjectsProvider glObjectsProvider) { - int sequenceIndex = 0; - videoCompositor.registerInputSource(sequenceIndex); + GlObjectsProvider glObjectsProvider, + int inputIndex) { + videoCompositor.registerInputSource(inputIndex); DefaultVideoFrameProcessor.Factory.Builder defaultVideoFrameProcessorFactoryBuilder = new DefaultVideoFrameProcessor.Factory.Builder() .setGlObjectsProvider(glObjectsProvider) @@ -871,7 +872,7 @@ public final class DefaultVideoCompositorPixelTest { textureBitmapReader.readBitmapUnpremultipliedAlpha( outputTexture, presentationTimeUs); videoCompositor.queueInputTexture( - sequenceIndex, + inputIndex, outputTextureProducer, outputTexture, ColorInfo.SRGB_BT709_FULL, @@ -885,7 +886,7 @@ public final class DefaultVideoCompositorPixelTest { .setTestId(testId) .setVideoFrameProcessorFactory(defaultVideoFrameProcessorFactoryBuilder.build()) .setBitmapReader(textureBitmapReader) - .setOnEndedListener(() -> videoCompositor.signalEndOfInputSource(sequenceIndex)); + .setOnEndedListener(() -> videoCompositor.signalEndOfInputSource(inputIndex)); } } 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 951f8165f8..9b053c3f3b 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSampleExporter.java @@ -97,7 +97,7 @@ import org.checkerframework.dataflow.qual.Pure; } @Override - public AudioGraphInput getInput(EditedMediaItem editedMediaItem, Format format, int sequenceIndex) + public AudioGraphInput getInput(EditedMediaItem editedMediaItem, Format format, int inputIndex) throws ExportException { if (!returnedFirstInput) { // First input initialized in constructor because output AudioFormat is needed. 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 30e1f81207..d7d3e65f87 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java @@ -129,7 +129,7 @@ import java.util.concurrent.atomic.AtomicLong; } @Override - public GraphInput getInput(EditedMediaItem item, Format format, int sequenceIndex) { + public GraphInput getInput(EditedMediaItem item, Format format, int inputIndex) { return this; } 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 eb5a5fba51..cafc939a5d 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SampleExporter.java @@ -64,11 +64,11 @@ import java.util.List; * * @param editedMediaItem The initial {@link EditedMediaItem} of the input. * @param format The initial {@link Format} of the input. - * @param sequenceIndex The index of the input sequence. + * @param inputIndex The index of the input. * @throws ExportException If an error occurs getting the input. */ public abstract GraphInput getInput( - EditedMediaItem editedMediaItem, Format format, int sequenceIndex) throws ExportException; + EditedMediaItem editedMediaItem, Format format, int inputIndex) throws ExportException; /** * Processes the input data and returns whether it may be possible to process more data by calling diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerMultipleInputVideoGraph.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerMultipleInputVideoGraph.java index c05ee46c7a..f206525bab 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerMultipleInputVideoGraph.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerMultipleInputVideoGraph.java @@ -79,9 +79,9 @@ import java.util.concurrent.Executor; } @Override - public GraphInput createInput(int sequenceIndex) throws VideoFrameProcessingException { - registerInput(sequenceIndex); + public GraphInput createInput(int inputIndex) throws VideoFrameProcessingException { + registerInput(inputIndex); return new VideoFrameProcessingWrapper( - getProcessor(sequenceIndex), /* presentation= */ null, getInitialTimestampOffsetUs()); + getProcessor(inputIndex), /* presentation= */ null, getInitialTimestampOffsetUs()); } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerSingleInputVideoGraph.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerSingleInputVideoGraph.java index 69c05cb0c9..571dd81ae6 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerSingleInputVideoGraph.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerSingleInputVideoGraph.java @@ -106,12 +106,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } @Override - public GraphInput createInput(int sequenceIndex) throws VideoFrameProcessingException { + public GraphInput createInput(int inputIndex) throws VideoFrameProcessingException { checkState(videoFrameProcessingWrapper == null); - registerInput(sequenceIndex); + registerInput(inputIndex); videoFrameProcessingWrapper = new VideoFrameProcessingWrapper( - getProcessor(sequenceIndex), getPresentation(), getInitialTimestampOffsetUs()); + getProcessor(inputIndex), getPresentation(), getInitialTimestampOffsetUs()); return videoFrameProcessingWrapper; } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerVideoGraph.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerVideoGraph.java index 59f5727a09..016da4c01a 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerVideoGraph.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerVideoGraph.java @@ -70,7 +70,7 @@ import java.util.concurrent.Executor; * *

If the method throws any {@link Exception}, the caller must call {@link #release}. * - * @param sequenceIndex The index of the input sequence, which is used to order the inputs. + * @param inputIndex The index of the input, which could be used to order the inputs. */ - GraphInput createInput(int sequenceIndex) throws VideoFrameProcessingException; + GraphInput createInput(int inputIndex) throws VideoFrameProcessingException; } 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 c1a5d4d011..7698b92d9e 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSampleExporter.java @@ -33,6 +33,7 @@ import android.media.MediaCodec; import android.media.MediaCodecInfo; import android.util.Pair; import android.view.Surface; +import androidx.annotation.IntRange; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.media3.common.C; @@ -154,10 +155,10 @@ import org.checkerframework.dataflow.qual.Pure; } @Override - public GraphInput getInput(EditedMediaItem editedMediaItem, Format format, int sequenceIndex) + public GraphInput getInput(EditedMediaItem editedMediaItem, Format format, int inputIndex) throws ExportException { try { - return videoGraph.createInput(sequenceIndex); + return videoGraph.createInput(inputIndex); } catch (VideoFrameProcessingException e) { throw ExportException.createForVideoFrameProcessingException(e); } @@ -543,18 +544,19 @@ import org.checkerframework.dataflow.qual.Pure; } @Override - public void registerInput(int sequenceIndex) throws VideoFrameProcessingException { - videoGraph.registerInput(sequenceIndex); + public void registerInput(@IntRange(from = 0) int inputIndex) + throws VideoFrameProcessingException { + videoGraph.registerInput(inputIndex); } @Override - public VideoFrameProcessor getProcessor(int sequenceIndex) { - return videoGraph.getProcessor(sequenceIndex); + public VideoFrameProcessor getProcessor(int inputIndex) { + return videoGraph.getProcessor(inputIndex); } @Override - public GraphInput createInput(int sequenceIndex) throws VideoFrameProcessingException { - return videoGraph.createInput(sequenceIndex); + public GraphInput createInput(int inputIndex) throws VideoFrameProcessingException { + return videoGraph.createInput(inputIndex); } @Override