Commit 9c3d3079 by tofunmi Committed by Rohit Singh

Move glObjectsProvider to DefaultVideoFrameProcessor.Factory.Builder

Removes glObjectsProvider from `VideoFrameProcessor` and `Effects`. Apps will set the glObjectsProvider on the DefaultVideoFrameProcessor.Factory.Builder when providing a custom DefaultVideoFrameProcessor.Factory, rather than in `Effects`.

PiperOrigin-RevId: 525169059
parent fae8111f
...@@ -43,13 +43,6 @@ public interface VideoFrameProcessor { ...@@ -43,13 +43,6 @@ public interface VideoFrameProcessor {
/** A factory for {@link VideoFrameProcessor} instances. */ /** A factory for {@link VideoFrameProcessor} instances. */
interface Factory { interface Factory {
/**
* Sets the {@link GlObjectsProvider}.
*
* <p>Must be called before {@link #create}.
*/
Factory setGlObjectsProvider(GlObjectsProvider glObjectsProvider);
// TODO(271433904): Turn parameters with default values into setters. // TODO(271433904): Turn parameters with default values into setters.
/** /**
* Creates a new {@link VideoFrameProcessor} instance. * Creates a new {@link VideoFrameProcessor} instance.
......
...@@ -78,11 +78,13 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { ...@@ -78,11 +78,13 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor {
/** A builder for {@link DefaultVideoFrameProcessor.Factory} instances. */ /** A builder for {@link DefaultVideoFrameProcessor.Factory} instances. */
public static final class Builder { public static final class Builder {
private boolean enableColorTransfers; private boolean enableColorTransfers;
private GlObjectsProvider glObjectsProvider;
@Nullable private TextureOutputListener textureOutputListener; @Nullable private TextureOutputListener textureOutputListener;
/** Creates an instance. */ /** Creates an instance. */
public Builder() { public Builder() {
enableColorTransfers = true; enableColorTransfers = true;
glObjectsProvider = GlObjectsProvider.DEFAULT;
} }
/** /**
...@@ -97,6 +99,17 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { ...@@ -97,6 +99,17 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor {
} }
/** /**
* Sets the {@link GlObjectsProvider}.
*
* <p>The default value is {@link GlObjectsProvider#DEFAULT}.
*/
@CanIgnoreReturnValue
public Builder setGlObjectsProvider(GlObjectsProvider glObjectsProvider) {
this.glObjectsProvider = glObjectsProvider;
return this;
}
/**
* Sets the {@link TextureOutputListener}. * Sets the {@link TextureOutputListener}.
* *
* <p>If set, the {@link VideoFrameProcessor} will output to an OpenGL texture, accessible via * <p>If set, the {@link VideoFrameProcessor} will output to an OpenGL texture, accessible via
...@@ -111,20 +124,23 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { ...@@ -111,20 +124,23 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor {
/** Builds an {@link DefaultVideoFrameProcessor.Factory} instance. */ /** Builds an {@link DefaultVideoFrameProcessor.Factory} instance. */
public DefaultVideoFrameProcessor.Factory build() { public DefaultVideoFrameProcessor.Factory build() {
return new DefaultVideoFrameProcessor.Factory(enableColorTransfers, textureOutputListener); return new DefaultVideoFrameProcessor.Factory(
enableColorTransfers, glObjectsProvider, textureOutputListener);
} }
} }
private final boolean enableColorTransfers; private final boolean enableColorTransfers;
private final GlObjectsProvider glObjectsProvider;
@Nullable private final TextureOutputListener textureOutputListener; @Nullable private final TextureOutputListener textureOutputListener;
private GlObjectsProvider glObjectsProvider = GlObjectsProvider.DEFAULT;
private Factory( private Factory(
boolean enableColorTransfers, @Nullable TextureOutputListener textureOutputListener) { boolean enableColorTransfers,
this.textureOutputListener = textureOutputListener; GlObjectsProvider glObjectsProvider,
@Nullable TextureOutputListener textureOutputListener) {
this.enableColorTransfers = enableColorTransfers; this.enableColorTransfers = enableColorTransfers;
this.glObjectsProvider = glObjectsProvider;
this.textureOutputListener = textureOutputListener;
} }
// TODO(276913828): Remove and change all calls to a builder. // TODO(276913828): Remove and change all calls to a builder.
...@@ -133,19 +149,10 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor { ...@@ -133,19 +149,10 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor {
*/ */
@Deprecated @Deprecated
public Factory() { public Factory() {
this(/* enableColorTransfers= */ true, /* textureOutputListener= */ null); this(
} /* enableColorTransfers= */ true,
GlObjectsProvider.DEFAULT,
// TODO(276913828): Move this setter to the DefaultVideoFrameProcessor.Factory.Builder. /* textureOutputListener= */ null);
/**
* {@inheritDoc}
*
* <p>The default value is {@link GlObjectsProvider#DEFAULT}.
*/
@Override
public Factory setGlObjectsProvider(GlObjectsProvider glObjectsProvider) {
this.glObjectsProvider = glObjectsProvider;
return this;
} }
/** /**
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
package androidx.media3.transformer; package androidx.media3.transformer;
import androidx.media3.common.Effect; import androidx.media3.common.Effect;
import androidx.media3.common.GlObjectsProvider;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.VideoFrameProcessor; import androidx.media3.common.VideoFrameProcessor;
import androidx.media3.common.audio.AudioProcessor; import androidx.media3.common.audio.AudioProcessor;
...@@ -50,25 +49,15 @@ public final class Effects { ...@@ -50,25 +49,15 @@ public final class Effects {
* applying the {@code videoEffects} to the video frames. * applying the {@code videoEffects} to the video frames.
*/ */
public final VideoFrameProcessor.Factory videoFrameProcessorFactory; public final VideoFrameProcessor.Factory videoFrameProcessorFactory;
/**
* The {@link GlObjectsProvider} used to create and maintain certain GL Objects in the {@link
* VideoFrameProcessor}.
*/
public final GlObjectsProvider glObjectsProvider;
/** /**
* Creates an instance using a {@link DefaultVideoFrameProcessor.Factory}. * Creates an instance using a {@link DefaultVideoFrameProcessor.Factory}.
* *
* <p>This is equivalent to calling {@link Effects#Effects(List, List, * <p>This is equivalent to calling {@link Effects#Effects(List, List,
* VideoFrameProcessor.Factory, GlObjectsProvider)} with a {@link * VideoFrameProcessor.Factory)} with a {@link DefaultVideoFrameProcessor.Factory}.
* DefaultVideoFrameProcessor.Factory} and {@link GlObjectsProvider#DEFAULT}.
*/ */
public Effects(List<AudioProcessor> audioProcessors, List<Effect> videoEffects) { public Effects(List<AudioProcessor> audioProcessors, List<Effect> videoEffects) {
this( this(audioProcessors, videoEffects, new DefaultVideoFrameProcessor.Factory.Builder().build());
audioProcessors,
videoEffects,
new DefaultVideoFrameProcessor.Factory(),
GlObjectsProvider.DEFAULT);
} }
/** /**
...@@ -77,16 +66,13 @@ public final class Effects { ...@@ -77,16 +66,13 @@ public final class Effects {
* @param audioProcessors The {@link #audioProcessors}. * @param audioProcessors The {@link #audioProcessors}.
* @param videoEffects The {@link #videoEffects}. * @param videoEffects The {@link #videoEffects}.
* @param videoFrameProcessorFactory The {@link #videoFrameProcessorFactory}. * @param videoFrameProcessorFactory The {@link #videoFrameProcessorFactory}.
* @param glObjectsProvider The {@link GlObjectsProvider}.
*/ */
public Effects( public Effects(
List<AudioProcessor> audioProcessors, List<AudioProcessor> audioProcessors,
List<Effect> videoEffects, List<Effect> videoEffects,
VideoFrameProcessor.Factory videoFrameProcessorFactory, VideoFrameProcessor.Factory videoFrameProcessorFactory) {
GlObjectsProvider glObjectsProvider) {
this.audioProcessors = ImmutableList.copyOf(audioProcessors); this.audioProcessors = ImmutableList.copyOf(audioProcessors);
this.videoEffects = ImmutableList.copyOf(videoEffects); this.videoEffects = ImmutableList.copyOf(videoEffects);
this.videoFrameProcessorFactory = videoFrameProcessorFactory; this.videoFrameProcessorFactory = videoFrameProcessorFactory;
this.glObjectsProvider = glObjectsProvider;
} }
} }
...@@ -28,7 +28,6 @@ import androidx.annotation.VisibleForTesting; ...@@ -28,7 +28,6 @@ import androidx.annotation.VisibleForTesting;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.DebugViewProvider; import androidx.media3.common.DebugViewProvider;
import androidx.media3.common.Effect; import androidx.media3.common.Effect;
import androidx.media3.common.GlObjectsProvider;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaLibraryInfo; import androidx.media3.common.MediaLibraryInfo;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
...@@ -89,7 +88,6 @@ public final class Transformer { ...@@ -89,7 +88,6 @@ public final class Transformer {
private ListenerSet<Transformer.Listener> listeners; private ListenerSet<Transformer.Listener> listeners;
private AssetLoader.@MonotonicNonNull Factory assetLoaderFactory; private AssetLoader.@MonotonicNonNull Factory assetLoaderFactory;
private VideoFrameProcessor.Factory videoFrameProcessorFactory; private VideoFrameProcessor.Factory videoFrameProcessorFactory;
private GlObjectsProvider glObjectsProvider;
private Codec.EncoderFactory encoderFactory; private Codec.EncoderFactory encoderFactory;
private Muxer.Factory muxerFactory; private Muxer.Factory muxerFactory;
private Looper looper; private Looper looper;
...@@ -106,8 +104,7 @@ public final class Transformer { ...@@ -106,8 +104,7 @@ public final class Transformer {
transformationRequest = new TransformationRequest.Builder().build(); transformationRequest = new TransformationRequest.Builder().build();
audioProcessors = ImmutableList.of(); audioProcessors = ImmutableList.of();
videoEffects = ImmutableList.of(); videoEffects = ImmutableList.of();
videoFrameProcessorFactory = new DefaultVideoFrameProcessor.Factory(); videoFrameProcessorFactory = new DefaultVideoFrameProcessor.Factory.Builder().build();
glObjectsProvider = GlObjectsProvider.DEFAULT;
encoderFactory = new DefaultEncoderFactory.Builder(this.context).build(); encoderFactory = new DefaultEncoderFactory.Builder(this.context).build();
muxerFactory = new DefaultMuxer.Factory(); muxerFactory = new DefaultMuxer.Factory();
looper = Util.getCurrentOrMainLooper(); looper = Util.getCurrentOrMainLooper();
...@@ -127,7 +124,6 @@ public final class Transformer { ...@@ -127,7 +124,6 @@ public final class Transformer {
this.listeners = transformer.listeners; this.listeners = transformer.listeners;
this.assetLoaderFactory = transformer.assetLoaderFactory; this.assetLoaderFactory = transformer.assetLoaderFactory;
this.videoFrameProcessorFactory = transformer.videoFrameProcessorFactory; this.videoFrameProcessorFactory = transformer.videoFrameProcessorFactory;
this.glObjectsProvider = transformer.glObjectsProvider;
this.encoderFactory = transformer.encoderFactory; this.encoderFactory = transformer.encoderFactory;
this.muxerFactory = transformer.muxerFactory; this.muxerFactory = transformer.muxerFactory;
this.looper = transformer.looper; this.looper = transformer.looper;
...@@ -401,7 +397,6 @@ public final class Transformer { ...@@ -401,7 +397,6 @@ public final class Transformer {
listeners, listeners,
assetLoaderFactory, assetLoaderFactory,
videoFrameProcessorFactory, videoFrameProcessorFactory,
glObjectsProvider,
encoderFactory, encoderFactory,
muxerFactory, muxerFactory,
looper, looper,
...@@ -566,7 +561,6 @@ public final class Transformer { ...@@ -566,7 +561,6 @@ public final class Transformer {
private final ListenerSet<Transformer.Listener> listeners; private final ListenerSet<Transformer.Listener> listeners;
private final AssetLoader.Factory assetLoaderFactory; private final AssetLoader.Factory assetLoaderFactory;
private final VideoFrameProcessor.Factory videoFrameProcessorFactory; private final VideoFrameProcessor.Factory videoFrameProcessorFactory;
private final GlObjectsProvider glObjectsProvider;
private final Codec.EncoderFactory encoderFactory; private final Codec.EncoderFactory encoderFactory;
private final Muxer.Factory muxerFactory; private final Muxer.Factory muxerFactory;
private final Looper looper; private final Looper looper;
...@@ -586,7 +580,6 @@ public final class Transformer { ...@@ -586,7 +580,6 @@ public final class Transformer {
ListenerSet<Listener> listeners, ListenerSet<Listener> listeners,
AssetLoader.Factory assetLoaderFactory, AssetLoader.Factory assetLoaderFactory,
VideoFrameProcessor.Factory videoFrameProcessorFactory, VideoFrameProcessor.Factory videoFrameProcessorFactory,
GlObjectsProvider glObjectsProvider,
Codec.EncoderFactory encoderFactory, Codec.EncoderFactory encoderFactory,
Muxer.Factory muxerFactory, Muxer.Factory muxerFactory,
Looper looper, Looper looper,
...@@ -603,7 +596,6 @@ public final class Transformer { ...@@ -603,7 +596,6 @@ public final class Transformer {
this.listeners = listeners; this.listeners = listeners;
this.assetLoaderFactory = assetLoaderFactory; this.assetLoaderFactory = assetLoaderFactory;
this.videoFrameProcessorFactory = videoFrameProcessorFactory; this.videoFrameProcessorFactory = videoFrameProcessorFactory;
this.glObjectsProvider = glObjectsProvider;
this.encoderFactory = encoderFactory; this.encoderFactory = encoderFactory;
this.muxerFactory = muxerFactory; this.muxerFactory = muxerFactory;
this.looper = looper; this.looper = looper;
...@@ -805,9 +797,7 @@ public final class Transformer { ...@@ -805,9 +797,7 @@ public final class Transformer {
.setRemoveAudio(removeAudio) .setRemoveAudio(removeAudio)
.setRemoveVideo(removeVideo) .setRemoveVideo(removeVideo)
.setFlattenForSlowMotion(flattenForSlowMotion) .setFlattenForSlowMotion(flattenForSlowMotion)
.setEffects( .setEffects(new Effects(audioProcessors, videoEffects, videoFrameProcessorFactory))
new Effects(
audioProcessors, videoEffects, videoFrameProcessorFactory, glObjectsProvider))
.build(); .build();
start(editedMediaItem, path); start(editedMediaItem, path);
} }
......
...@@ -566,7 +566,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -566,7 +566,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
firstEditedMediaItem.effects.videoEffects, firstEditedMediaItem.effects.videoEffects,
compositionPresentation, compositionPresentation,
firstEditedMediaItem.effects.videoFrameProcessorFactory, firstEditedMediaItem.effects.videoFrameProcessorFactory,
firstEditedMediaItem.effects.glObjectsProvider,
encoderFactory, encoderFactory,
muxerWrapper, muxerWrapper,
/* errorConsumer= */ this::onError, /* errorConsumer= */ this::onError,
......
...@@ -35,7 +35,6 @@ import androidx.media3.common.DebugViewProvider; ...@@ -35,7 +35,6 @@ import androidx.media3.common.DebugViewProvider;
import androidx.media3.common.Effect; import androidx.media3.common.Effect;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.FrameInfo; import androidx.media3.common.FrameInfo;
import androidx.media3.common.GlObjectsProvider;
import androidx.media3.common.MimeTypes; import androidx.media3.common.MimeTypes;
import androidx.media3.common.SurfaceInfo; import androidx.media3.common.SurfaceInfo;
import androidx.media3.common.VideoFrameProcessingException; import androidx.media3.common.VideoFrameProcessingException;
...@@ -81,7 +80,6 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -81,7 +80,6 @@ import org.checkerframework.dataflow.qual.Pure;
ImmutableList<Effect> effects, ImmutableList<Effect> effects,
@Nullable Presentation presentation, @Nullable Presentation presentation,
VideoFrameProcessor.Factory videoFrameProcessorFactory, VideoFrameProcessor.Factory videoFrameProcessorFactory,
GlObjectsProvider glObjectsProvider,
Codec.EncoderFactory encoderFactory, Codec.EncoderFactory encoderFactory,
MuxerWrapper muxerWrapper, MuxerWrapper muxerWrapper,
Consumer<ExportException> errorConsumer, Consumer<ExportException> errorConsumer,
...@@ -132,57 +130,55 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -132,57 +130,55 @@ import org.checkerframework.dataflow.qual.Pure;
} }
try { try {
videoFrameProcessor = videoFrameProcessor =
videoFrameProcessorFactory videoFrameProcessorFactory.create(
.setGlObjectsProvider(glObjectsProvider) context,
.create( effectsWithPresentation,
context, debugViewProvider,
effectsWithPresentation, videoFrameProcessorInputColor,
debugViewProvider, videoFrameProcessorOutputColor,
videoFrameProcessorInputColor, MimeTypes.isVideo(firstInputFormat.sampleMimeType),
videoFrameProcessorOutputColor, /* releaseFramesAutomatically= */ true,
MimeTypes.isVideo(firstInputFormat.sampleMimeType), MoreExecutors.directExecutor(),
/* releaseFramesAutomatically= */ true, new VideoFrameProcessor.Listener() {
MoreExecutors.directExecutor(), private long lastProcessedFramePresentationTimeUs;
new VideoFrameProcessor.Listener() {
private long lastProcessedFramePresentationTimeUs; @Override
public void onOutputSizeChanged(int width, int height) {
@Override try {
public void onOutputSizeChanged(int width, int height) { checkNotNull(videoFrameProcessor)
try { .setOutputSurfaceInfo(encoderWrapper.getSurfaceInfo(width, height));
checkNotNull(videoFrameProcessor) } catch (ExportException exception) {
.setOutputSurfaceInfo(encoderWrapper.getSurfaceInfo(width, height)); errorConsumer.accept(exception);
} catch (ExportException exception) { }
errorConsumer.accept(exception); }
}
} @Override
public void onOutputFrameAvailable(long presentationTimeUs) {
@Override // Frames are released automatically.
public void onOutputFrameAvailable(long presentationTimeUs) { if (presentationTimeUs == 0) {
// Frames are released automatically. encoderExpectsTimestampZero = true;
if (presentationTimeUs == 0) { }
encoderExpectsTimestampZero = true; lastProcessedFramePresentationTimeUs = presentationTimeUs;
} }
lastProcessedFramePresentationTimeUs = presentationTimeUs;
} @Override
public void onError(VideoFrameProcessingException exception) {
@Override errorConsumer.accept(
public void onError(VideoFrameProcessingException exception) { ExportException.createForVideoFrameProcessingException(
errorConsumer.accept( exception, ExportException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED));
ExportException.createForVideoFrameProcessingException( }
exception, ExportException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED));
} @Override
public void onEnded() {
@Override VideoSamplePipeline.this.finalFramePresentationTimeUs =
public void onEnded() { lastProcessedFramePresentationTimeUs;
VideoSamplePipeline.this.finalFramePresentationTimeUs = try {
lastProcessedFramePresentationTimeUs; encoderWrapper.signalEndOfInputStream();
try { } catch (ExportException exception) {
encoderWrapper.signalEndOfInputStream(); errorConsumer.accept(exception);
} catch (ExportException exception) { }
errorConsumer.accept(exception); }
} });
}
});
} catch (VideoFrameProcessingException e) { } catch (VideoFrameProcessingException e) {
throw ExportException.createForVideoFrameProcessingException( throw ExportException.createForVideoFrameProcessingException(
e, ExportException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED); e, ExportException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment