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
This commit is contained in:
parent
fae8111f59
commit
9c3d30791a
@ -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 {
|
|||||||
/** 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -96,6 +98,17 @@ public final class DefaultVideoFrameProcessor implements VideoFrameProcessor {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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}.
|
||||||
*
|
*
|
||||||
@ -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 {
|
|||||||
*/
|
*/
|
||||||
@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 @@
|
|||||||
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 {
|
|||||||
* 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 {
|
|||||||
* @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;
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
listeners,
|
listeners,
|
||||||
assetLoaderFactory,
|
assetLoaderFactory,
|
||||||
videoFrameProcessorFactory,
|
videoFrameProcessorFactory,
|
||||||
glObjectsProvider,
|
|
||||||
encoderFactory,
|
encoderFactory,
|
||||||
muxerFactory,
|
muxerFactory,
|
||||||
looper,
|
looper,
|
||||||
@ -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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
.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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
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;
|
|||||||
}
|
}
|
||||||
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
|
@Override
|
||||||
public void onOutputSizeChanged(int width, int height) {
|
public void onOutputSizeChanged(int width, int height) {
|
||||||
try {
|
try {
|
||||||
checkNotNull(videoFrameProcessor)
|
checkNotNull(videoFrameProcessor)
|
||||||
.setOutputSurfaceInfo(encoderWrapper.getSurfaceInfo(width, height));
|
.setOutputSurfaceInfo(encoderWrapper.getSurfaceInfo(width, height));
|
||||||
} catch (ExportException exception) {
|
} catch (ExportException exception) {
|
||||||
errorConsumer.accept(exception);
|
errorConsumer.accept(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onOutputFrameAvailable(long presentationTimeUs) {
|
public void onOutputFrameAvailable(long presentationTimeUs) {
|
||||||
// Frames are released automatically.
|
// Frames are released automatically.
|
||||||
if (presentationTimeUs == 0) {
|
if (presentationTimeUs == 0) {
|
||||||
encoderExpectsTimestampZero = true;
|
encoderExpectsTimestampZero = true;
|
||||||
}
|
}
|
||||||
lastProcessedFramePresentationTimeUs = presentationTimeUs;
|
lastProcessedFramePresentationTimeUs = presentationTimeUs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(VideoFrameProcessingException exception) {
|
public void onError(VideoFrameProcessingException exception) {
|
||||||
errorConsumer.accept(
|
errorConsumer.accept(
|
||||||
ExportException.createForVideoFrameProcessingException(
|
ExportException.createForVideoFrameProcessingException(
|
||||||
exception, ExportException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED));
|
exception, ExportException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnded() {
|
public void onEnded() {
|
||||||
VideoSamplePipeline.this.finalFramePresentationTimeUs =
|
VideoSamplePipeline.this.finalFramePresentationTimeUs =
|
||||||
lastProcessedFramePresentationTimeUs;
|
lastProcessedFramePresentationTimeUs;
|
||||||
try {
|
try {
|
||||||
encoderWrapper.signalEndOfInputStream();
|
encoderWrapper.signalEndOfInputStream();
|
||||||
} catch (ExportException exception) {
|
} catch (ExportException exception) {
|
||||||
errorConsumer.accept(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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user