Use sparse array in MultipleInputVideoGraph, fix formatting

This commit is contained in:
Patrik Aradi 2024-01-31 13:48:24 +08:00 committed by Luyuan Chen
parent 177f1f33d0
commit b909162daa
3 changed files with 13 additions and 20 deletions

View file

@ -46,7 +46,6 @@ import androidx.media3.common.VideoFrameProcessingException;
import androidx.media3.common.VideoFrameProcessor; import androidx.media3.common.VideoFrameProcessor;
import androidx.media3.common.VideoGraph; import androidx.media3.common.VideoGraph;
import androidx.media3.common.util.GlUtil; import androidx.media3.common.util.GlUtil;
import androidx.media3.common.util.NullableType;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import java.util.ArrayDeque; import java.util.ArrayDeque;
@ -76,7 +75,7 @@ public abstract class MultipleInputVideoGraph implements VideoGraph {
private final Executor listenerExecutor; private final Executor listenerExecutor;
private final VideoCompositorSettings videoCompositorSettings; private final VideoCompositorSettings videoCompositorSettings;
private final List<Effect> compositionEffects; private final List<Effect> compositionEffects;
private final List<@NullableType VideoFrameProcessor> preProcessors; private final SparseArray<VideoFrameProcessor> preProcessors;
private final ExecutorService sharedExecutorService; private final ExecutorService sharedExecutorService;
@ -115,7 +114,7 @@ public abstract class MultipleInputVideoGraph implements VideoGraph {
this.compositionEffects = new ArrayList<>(compositionEffects); this.compositionEffects = new ArrayList<>(compositionEffects);
this.initialTimestampOffsetUs = initialTimestampOffsetUs; this.initialTimestampOffsetUs = initialTimestampOffsetUs;
lastRenderedPresentationTimeUs = C.TIME_UNSET; lastRenderedPresentationTimeUs = C.TIME_UNSET;
preProcessors = new ArrayList<>(); preProcessors = new SparseArray<>();
sharedExecutorService = newSingleThreadScheduledExecutor(SHARED_EXECUTOR_NAME); sharedExecutorService = newSingleThreadScheduledExecutor(SHARED_EXECUTOR_NAME);
glObjectsProvider = new SingleContextGlObjectsProvider(); glObjectsProvider = new SingleContextGlObjectsProvider();
// TODO - b/289986435: Support injecting VideoFrameProcessor.Factory. // TODO - b/289986435: Support injecting VideoFrameProcessor.Factory.
@ -137,7 +136,7 @@ public abstract class MultipleInputVideoGraph implements VideoGraph {
@Override @Override
public void initialize() throws VideoFrameProcessingException { public void initialize() throws VideoFrameProcessingException {
checkState( checkState(
preProcessors.isEmpty() preProcessors.size() == 0
&& videoCompositor == null && videoCompositor == null
&& compositionVideoFrameProcessor == null && compositionVideoFrameProcessor == null
&& !released); && !released);
@ -212,11 +211,10 @@ public abstract class MultipleInputVideoGraph implements VideoGraph {
} }
@Override @Override
public int registerInput(int forceId) throws VideoFrameProcessingException { public int registerInput(int sequenceIndex) throws VideoFrameProcessingException {
checkStateNotNull(videoCompositor); checkStateNotNull(videoCompositor);
int videoCompositorInputId; int videoCompositorInputId = videoCompositor.registerInputSource(sequenceIndex);
videoCompositorInputId = videoCompositor.registerInputSource(forceId);
// Creating a new VideoFrameProcessor for the input. // Creating a new VideoFrameProcessor for the input.
VideoFrameProcessor preProcessor = VideoFrameProcessor preProcessor =
videoFrameProcessorFactory videoFrameProcessorFactory
@ -260,17 +258,13 @@ public abstract class MultipleInputVideoGraph implements VideoGraph {
} }
}); });
while (preProcessors.size() <= videoCompositorInputId) { preProcessors.put(videoCompositorInputId, preProcessor);
//noinspection DataFlowIssue
preProcessors.add(null);
}
preProcessors.set(videoCompositorInputId, preProcessor);
return videoCompositorInputId; return videoCompositorInputId;
} }
@Override @Override
public VideoFrameProcessor getProcessor(int inputId) { public VideoFrameProcessor getProcessor(int inputId) {
checkState(inputId < preProcessors.size()); checkState(preProcessors.indexOfKey(inputId) >= 0);
return preProcessors.get(inputId); return preProcessors.get(inputId);
} }
@ -292,7 +286,7 @@ public abstract class MultipleInputVideoGraph implements VideoGraph {
// Needs to release the frame processors before their internal executor services are released. // Needs to release the frame processors before their internal executor services are released.
for (int i = 0; i < preProcessors.size(); i++) { for (int i = 0; i < preProcessors.size(); i++) {
preProcessors.get(i).release(); preProcessors.get(preProcessors.keyAt(i)).release();
} }
preProcessors.clear(); preProcessors.clear();

View file

@ -22,7 +22,6 @@ import androidx.media3.common.DebugViewProvider;
import androidx.media3.common.Effect; import androidx.media3.common.Effect;
import androidx.media3.common.VideoFrameProcessingException; import androidx.media3.common.VideoFrameProcessingException;
import androidx.media3.common.VideoGraph; import androidx.media3.common.VideoGraph;
import androidx.media3.common.util.Log;
import androidx.media3.effect.MultipleInputVideoGraph; import androidx.media3.effect.MultipleInputVideoGraph;
import androidx.media3.effect.VideoCompositorSettings; import androidx.media3.effect.VideoCompositorSettings;
import java.util.List; import java.util.List;

View file

@ -110,11 +110,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
checkState(videoFrameProcessingWrapper == null); checkState(videoFrameProcessingWrapper == null);
int inputId = registerInput(sequenceIndex); int inputId = registerInput(sequenceIndex);
videoFrameProcessingWrapper = videoFrameProcessingWrapper =
new VideoFrameProcessingWrapper( new VideoFrameProcessingWrapper(
getProcessor(inputId), getProcessor(inputId),
getInputColorInfo(), getInputColorInfo(),
getPresentation(), getPresentation(),
getInitialTimestampOffsetUs()); getInitialTimestampOffsetUs());
return videoFrameProcessingWrapper; return videoFrameProcessingWrapper;
} }
} }