mirror of
https://github.com/androidx/media.git
synced 2025-05-18 04:59:54 +08:00
MultipleInputVideoGraph: propagate Compositor output size changes
PiperOrigin-RevId: 756260135
This commit is contained in:
parent
ce5e61e26f
commit
81e4488f0a
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user