MultipleInputVideoGraph: propagate Compositor output size changes

PiperOrigin-RevId: 756260135
This commit is contained in:
kimvde 2025-05-08 04:56:07 -07:00 committed by Copybara-Service
parent ce5e61e26f
commit 81e4488f0a

View File

@ -54,6 +54,7 @@ import androidx.media3.common.VideoFrameProcessor;
import androidx.media3.common.VideoGraph; import androidx.media3.common.VideoGraph;
import androidx.media3.common.util.GlUtil.GlException; import androidx.media3.common.util.GlUtil.GlException;
import androidx.media3.common.util.Log; import androidx.media3.common.util.Log;
import androidx.media3.common.util.Size;
import androidx.media3.common.util.TimestampIterator; import androidx.media3.common.util.TimestampIterator;
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;
@ -143,8 +144,8 @@ public final class MultipleInputVideoGraph implements VideoGraph {
@Nullable private VideoFrameProcessor compositionVideoFrameProcessor; @Nullable private VideoFrameProcessor compositionVideoFrameProcessor;
@Nullable private VideoCompositor videoCompositor; @Nullable private VideoCompositor videoCompositor;
private Size compositorOutputSize;
private boolean compositionVideoFrameProcessorInputStreamRegistered;
private boolean compositorEnded; private boolean compositorEnded;
private boolean released; private boolean released;
private long lastRenderedPresentationTimeUs; private long lastRenderedPresentationTimeUs;
@ -183,6 +184,7 @@ public final class MultipleInputVideoGraph implements VideoGraph {
.build(); .build();
compositorOutputTextures = new ArrayDeque<>(); compositorOutputTextures = new ArrayDeque<>();
compositorOutputTextureReleases = new SparseArray<>(); compositorOutputTextureReleases = new SparseArray<>();
compositorOutputSize = Size.UNKNOWN;
} }
/** /**
@ -472,25 +474,6 @@ public final class MultipleInputVideoGraph implements VideoGraph {
compositorOutputTextureReleases.put( compositorOutputTextureReleases.put(
outputTexture.texId, outputTexture.texId,
new CompositorOutputTextureRelease(textureProducer, presentationTimeUs)); new CompositorOutputTextureRelease(textureProducer, presentationTimeUs));
if (!compositionVideoFrameProcessorInputStreamRegistered) {
checkStateNotNull(compositionVideoFrameProcessor)
.registerInputStream(
INPUT_TYPE_TEXTURE_ID,
// Pre-processing VideoFrameProcessors have converted the inputColor to outputColor
// already, so use outputColorInfo for the input color to the
// compositionVideoFrameProcessor.
new Format.Builder()
.setColorInfo(outputColorInfo)
.setWidth(outputTexture.width)
.setHeight(outputTexture.height)
.build(),
compositionEffects,
/* offsetToAddUs= */ 0);
compositionVideoFrameProcessorInputStreamRegistered = true;
// Return as the VideoFrameProcessor rejects input textures until the input is registered.
return;
}
queueCompositionOutputInternal(); queueCompositionOutputInternal();
} }
@ -526,6 +509,23 @@ public final class MultipleInputVideoGraph implements VideoGraph {
} }
VideoFrameProcessor compositionVideoFrameProcessor = VideoFrameProcessor compositionVideoFrameProcessor =
checkStateNotNull(this.compositionVideoFrameProcessor); checkStateNotNull(this.compositionVideoFrameProcessor);
int width = outputTexture.glTextureInfo.width;
int height = outputTexture.glTextureInfo.height;
if (width != compositorOutputSize.getWidth() || height != compositorOutputSize.getHeight()) {
compositionVideoFrameProcessor.registerInputStream(
INPUT_TYPE_TEXTURE_ID,
// Pre-processing VideoFrameProcessors have converted the inputColor to outputColor
// already, so use outputColorInfo for the input color to the
// compositionVideoFrameProcessor.
new Format.Builder()
.setColorInfo(outputColorInfo)
.setWidth(width)
.setHeight(height)
.build(),
compositionEffects,
/* offsetToAddUs= */ 0);
compositorOutputSize = new Size(width, height);
}
if (!compositionVideoFrameProcessor.queueInputTexture( if (!compositionVideoFrameProcessor.queueInputTexture(
outputTexture.glTextureInfo.texId, outputTexture.presentationTimeUs)) { outputTexture.glTextureInfo.texId, outputTexture.presentationTimeUs)) {
return; return;