mirror of
https://github.com/samsonjs/media.git
synced 2026-04-26 14:57:47 +00:00
Remove asyncErrorListener
PiperOrigin-RevId: 488310077
This commit is contained in:
parent
3f1b1b70ed
commit
6d266bfc0d
6 changed files with 40 additions and 63 deletions
|
|
@ -92,8 +92,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||||
progressState = PROGRESS_STATE_NO_TRANSFORMATION;
|
progressState = PROGRESS_STATE_NO_TRANSFORMATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start(
|
public void start(MediaItem mediaItem, Listener listener) {
|
||||||
MediaItem mediaItem, Listener listener, Transformer.AsyncErrorListener asyncErrorListener) {
|
|
||||||
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
|
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
|
||||||
trackSelector.setParameters(
|
trackSelector.setParameters(
|
||||||
new DefaultTrackSelector.Parameters.Builder(context)
|
new DefaultTrackSelector.Parameters.Builder(context)
|
||||||
|
|
@ -110,9 +109,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||||
DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / 10)
|
DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / 10)
|
||||||
.build();
|
.build();
|
||||||
ExoPlayer.Builder playerBuilder =
|
ExoPlayer.Builder playerBuilder =
|
||||||
new ExoPlayer.Builder(
|
new ExoPlayer.Builder(context, new RenderersFactoryImpl(removeAudio, removeVideo, listener))
|
||||||
context,
|
|
||||||
new RenderersFactoryImpl(removeAudio, removeVideo, listener, asyncErrorListener))
|
|
||||||
.setMediaSourceFactory(mediaSourceFactory)
|
.setMediaSourceFactory(mediaSourceFactory)
|
||||||
.setTrackSelector(trackSelector)
|
.setTrackSelector(trackSelector)
|
||||||
.setLoadControl(loadControl)
|
.setLoadControl(loadControl)
|
||||||
|
|
@ -156,17 +153,14 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||||
private final boolean removeAudio;
|
private final boolean removeAudio;
|
||||||
private final boolean removeVideo;
|
private final boolean removeVideo;
|
||||||
private final ExoPlayerAssetLoader.Listener assetLoaderListener;
|
private final ExoPlayerAssetLoader.Listener assetLoaderListener;
|
||||||
private final Transformer.AsyncErrorListener asyncErrorListener;
|
|
||||||
|
|
||||||
public RenderersFactoryImpl(
|
public RenderersFactoryImpl(
|
||||||
boolean removeAudio,
|
boolean removeAudio,
|
||||||
boolean removeVideo,
|
boolean removeVideo,
|
||||||
ExoPlayerAssetLoader.Listener assetLoaderListener,
|
ExoPlayerAssetLoader.Listener assetLoaderListener) {
|
||||||
Transformer.AsyncErrorListener asyncErrorListener) {
|
|
||||||
this.removeAudio = removeAudio;
|
this.removeAudio = removeAudio;
|
||||||
this.removeVideo = removeVideo;
|
this.removeVideo = removeVideo;
|
||||||
this.assetLoaderListener = assetLoaderListener;
|
this.assetLoaderListener = assetLoaderListener;
|
||||||
this.asyncErrorListener = asyncErrorListener;
|
|
||||||
mediaClock = new TransformerMediaClock();
|
mediaClock = new TransformerMediaClock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,14 +176,12 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
if (!removeAudio) {
|
if (!removeAudio) {
|
||||||
renderers[index] =
|
renderers[index] =
|
||||||
new ExoPlayerAssetLoaderRenderer(
|
new ExoPlayerAssetLoaderRenderer(C.TRACK_TYPE_AUDIO, mediaClock, assetLoaderListener);
|
||||||
C.TRACK_TYPE_AUDIO, mediaClock, assetLoaderListener, asyncErrorListener);
|
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
if (!removeVideo) {
|
if (!removeVideo) {
|
||||||
renderers[index] =
|
renderers[index] =
|
||||||
new ExoPlayerAssetLoaderRenderer(
|
new ExoPlayerAssetLoaderRenderer(C.TRACK_TYPE_VIDEO, mediaClock, assetLoaderListener);
|
||||||
C.TRACK_TYPE_VIDEO, mediaClock, assetLoaderListener, asyncErrorListener);
|
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
return renderers;
|
return renderers;
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
|
|
||||||
private final TransformerMediaClock mediaClock;
|
private final TransformerMediaClock mediaClock;
|
||||||
private final ExoPlayerAssetLoader.Listener assetLoaderListener;
|
private final ExoPlayerAssetLoader.Listener assetLoaderListener;
|
||||||
private final Transformer.AsyncErrorListener asyncErrorListener;
|
|
||||||
private final DecoderInputBuffer decoderInputBuffer;
|
private final DecoderInputBuffer decoderInputBuffer;
|
||||||
|
|
||||||
private boolean isTransformationRunning;
|
private boolean isTransformationRunning;
|
||||||
|
|
@ -51,12 +50,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
public ExoPlayerAssetLoaderRenderer(
|
public ExoPlayerAssetLoaderRenderer(
|
||||||
int trackType,
|
int trackType,
|
||||||
TransformerMediaClock mediaClock,
|
TransformerMediaClock mediaClock,
|
||||||
ExoPlayerAssetLoader.Listener assetLoaderListener,
|
ExoPlayerAssetLoader.Listener assetLoaderListener) {
|
||||||
Transformer.AsyncErrorListener asyncErrorListener) {
|
|
||||||
super(trackType);
|
super(trackType);
|
||||||
this.mediaClock = mediaClock;
|
this.mediaClock = mediaClock;
|
||||||
this.assetLoaderListener = assetLoaderListener;
|
this.assetLoaderListener = assetLoaderListener;
|
||||||
this.asyncErrorListener = asyncErrorListener;
|
|
||||||
decoderInputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED);
|
decoderInputBuffer = new DecoderInputBuffer(BUFFER_REPLACEMENT_MODE_DISABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,7 +101,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
while (samplePipeline.processData() || feedPipelineFromInput()) {}
|
while (samplePipeline.processData() || feedPipelineFromInput()) {}
|
||||||
} catch (TransformationException e) {
|
} catch (TransformationException e) {
|
||||||
isTransformationRunning = false;
|
isTransformationRunning = false;
|
||||||
asyncErrorListener.onTransformationError(e);
|
assetLoaderListener.onError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ import android.util.SparseLongArray;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
|
import com.google.android.exoplayer2.util.Consumer;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
@ -57,7 +58,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
@Nullable private final String outputPath;
|
@Nullable private final String outputPath;
|
||||||
@Nullable private final ParcelFileDescriptor outputParcelFileDescriptor;
|
@Nullable private final ParcelFileDescriptor outputParcelFileDescriptor;
|
||||||
private final Muxer.Factory muxerFactory;
|
private final Muxer.Factory muxerFactory;
|
||||||
private final Transformer.AsyncErrorListener asyncErrorListener;
|
private final Consumer<TransformationException> errorConsumer;
|
||||||
private final SparseIntArray trackTypeToIndex;
|
private final SparseIntArray trackTypeToIndex;
|
||||||
private final SparseIntArray trackTypeToSampleCount;
|
private final SparseIntArray trackTypeToSampleCount;
|
||||||
private final SparseLongArray trackTypeToTimeUs;
|
private final SparseLongArray trackTypeToTimeUs;
|
||||||
|
|
@ -77,7 +78,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
@Nullable String outputPath,
|
@Nullable String outputPath,
|
||||||
@Nullable ParcelFileDescriptor outputParcelFileDescriptor,
|
@Nullable ParcelFileDescriptor outputParcelFileDescriptor,
|
||||||
Muxer.Factory muxerFactory,
|
Muxer.Factory muxerFactory,
|
||||||
Transformer.AsyncErrorListener asyncErrorListener) {
|
Consumer<TransformationException> errorConsumer) {
|
||||||
if (outputPath == null && outputParcelFileDescriptor == null) {
|
if (outputPath == null && outputParcelFileDescriptor == null) {
|
||||||
throw new NullPointerException("Both output path and ParcelFileDescriptor are null");
|
throw new NullPointerException("Both output path and ParcelFileDescriptor are null");
|
||||||
}
|
}
|
||||||
|
|
@ -85,7 +86,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
this.outputPath = outputPath;
|
this.outputPath = outputPath;
|
||||||
this.outputParcelFileDescriptor = outputParcelFileDescriptor;
|
this.outputParcelFileDescriptor = outputParcelFileDescriptor;
|
||||||
this.muxerFactory = muxerFactory;
|
this.muxerFactory = muxerFactory;
|
||||||
this.asyncErrorListener = asyncErrorListener;
|
this.errorConsumer = errorConsumer;
|
||||||
|
|
||||||
trackTypeToIndex = new SparseIntArray();
|
trackTypeToIndex = new SparseIntArray();
|
||||||
trackTypeToSampleCount = new SparseIntArray();
|
trackTypeToSampleCount = new SparseIntArray();
|
||||||
|
|
@ -306,7 +307,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
isAborted = true;
|
isAborted = true;
|
||||||
asyncErrorListener.onTransformationError(
|
errorConsumer.accept(
|
||||||
TransformationException.createForMuxer(
|
TransformationException.createForMuxer(
|
||||||
new IllegalStateException(
|
new IllegalStateException(
|
||||||
"No output sample written in the last "
|
"No output sample written in the last "
|
||||||
|
|
|
||||||
|
|
@ -713,22 +713,19 @@ public final class Transformer {
|
||||||
throw new IllegalStateException("There is already a transformation in progress.");
|
throw new IllegalStateException("There is already a transformation in progress.");
|
||||||
}
|
}
|
||||||
transformationInProgress = true;
|
transformationInProgress = true;
|
||||||
ComponentListener componentListener = new ComponentListener(mediaItem, looper);
|
TransformerInternalListener transformerInternalListener =
|
||||||
|
new TransformerInternalListener(mediaItem, looper);
|
||||||
MuxerWrapper muxerWrapper =
|
MuxerWrapper muxerWrapper =
|
||||||
new MuxerWrapper(
|
new MuxerWrapper(
|
||||||
outputPath,
|
outputPath,
|
||||||
outputParcelFileDescriptor,
|
outputParcelFileDescriptor,
|
||||||
muxerFactory,
|
muxerFactory,
|
||||||
/* asyncErrorListener= */ componentListener);
|
/* errorConsumer= */ transformerInternalListener::onTransformationError);
|
||||||
this.muxerWrapper = muxerWrapper;
|
this.muxerWrapper = muxerWrapper;
|
||||||
FallbackListener fallbackListener =
|
FallbackListener fallbackListener =
|
||||||
new FallbackListener(mediaItem, listeners, transformationRequest);
|
new FallbackListener(mediaItem, listeners, transformationRequest);
|
||||||
transformerInternal.start(
|
transformerInternal.start(
|
||||||
mediaItem,
|
mediaItem, muxerWrapper, transformerInternalListener, fallbackListener);
|
||||||
muxerWrapper,
|
|
||||||
/* listener= */ componentListener,
|
|
||||||
fallbackListener,
|
|
||||||
/* asyncErrorListener= */ componentListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -822,23 +819,12 @@ public final class Transformer {
|
||||||
return fileSize;
|
return fileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Listener for exceptions that occur during a transformation. */
|
private final class TransformerInternalListener implements TransformerInternal.Listener {
|
||||||
/* package */ interface AsyncErrorListener {
|
|
||||||
/**
|
|
||||||
* Called when a {@link TransformationException} occurs.
|
|
||||||
*
|
|
||||||
* <p>Can be called from any thread.
|
|
||||||
*/
|
|
||||||
void onTransformationError(TransformationException exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private final class ComponentListener
|
|
||||||
implements TransformerInternal.Listener, AsyncErrorListener {
|
|
||||||
|
|
||||||
private final MediaItem mediaItem;
|
private final MediaItem mediaItem;
|
||||||
private final Handler handler;
|
private final Handler handler;
|
||||||
|
|
||||||
public ComponentListener(MediaItem mediaItem, Looper looper) {
|
public TransformerInternalListener(MediaItem mediaItem, Looper looper) {
|
||||||
this.mediaItem = mediaItem;
|
this.mediaItem = mediaItem;
|
||||||
handler = new Handler(looper);
|
handler = new Handler(looper);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,12 +80,10 @@ import com.google.common.collect.ImmutableList;
|
||||||
MediaItem mediaItem,
|
MediaItem mediaItem,
|
||||||
MuxerWrapper muxerWrapper,
|
MuxerWrapper muxerWrapper,
|
||||||
Listener listener,
|
Listener listener,
|
||||||
FallbackListener fallbackListener,
|
FallbackListener fallbackListener) {
|
||||||
Transformer.AsyncErrorListener asyncErrorListener) {
|
AssetLoaderListener assetLoaderListener =
|
||||||
ComponentListener componentListener =
|
new AssetLoaderListener(mediaItem, muxerWrapper, listener, fallbackListener);
|
||||||
new ComponentListener(
|
exoPlayerAssetLoader.start(mediaItem, assetLoaderListener);
|
||||||
mediaItem, muxerWrapper, listener, fallbackListener, asyncErrorListener);
|
|
||||||
exoPlayerAssetLoader.start(mediaItem, componentListener, asyncErrorListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public @Transformer.ProgressState int getProgress(ProgressHolder progressHolder) {
|
public @Transformer.ProgressState int getProgress(ProgressHolder progressHolder) {
|
||||||
|
|
@ -96,27 +94,24 @@ import com.google.common.collect.ImmutableList;
|
||||||
exoPlayerAssetLoader.release();
|
exoPlayerAssetLoader.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ComponentListener implements ExoPlayerAssetLoader.Listener {
|
private class AssetLoaderListener implements ExoPlayerAssetLoader.Listener {
|
||||||
|
|
||||||
private final MediaItem mediaItem;
|
private final MediaItem mediaItem;
|
||||||
private final MuxerWrapper muxerWrapper;
|
private final MuxerWrapper muxerWrapper;
|
||||||
private final TransformerInternal.Listener listener;
|
private final TransformerInternal.Listener listener;
|
||||||
private final FallbackListener fallbackListener;
|
private final FallbackListener fallbackListener;
|
||||||
private final Transformer.AsyncErrorListener asyncErrorListener;
|
|
||||||
|
|
||||||
private volatile boolean trackRegistered;
|
private volatile boolean trackRegistered;
|
||||||
|
|
||||||
public ComponentListener(
|
public AssetLoaderListener(
|
||||||
MediaItem mediaItem,
|
MediaItem mediaItem,
|
||||||
MuxerWrapper muxerWrapper,
|
MuxerWrapper muxerWrapper,
|
||||||
Listener listener,
|
Listener listener,
|
||||||
FallbackListener fallbackListener,
|
FallbackListener fallbackListener) {
|
||||||
Transformer.AsyncErrorListener asyncErrorListener) {
|
|
||||||
this.mediaItem = mediaItem;
|
this.mediaItem = mediaItem;
|
||||||
this.muxerWrapper = muxerWrapper;
|
this.muxerWrapper = muxerWrapper;
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
this.fallbackListener = fallbackListener;
|
this.fallbackListener = fallbackListener;
|
||||||
this.asyncErrorListener = asyncErrorListener;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -142,10 +137,15 @@ import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(Exception e) {
|
public void onError(Exception e) {
|
||||||
TransformationException transformationException =
|
TransformationException transformationException;
|
||||||
e instanceof PlaybackException
|
if (e instanceof TransformationException) {
|
||||||
? TransformationException.createForPlaybackException((PlaybackException) e)
|
transformationException = (TransformationException) e;
|
||||||
: TransformationException.createForUnexpected(e);
|
} else if (e instanceof PlaybackException) {
|
||||||
|
transformationException =
|
||||||
|
TransformationException.createForPlaybackException((PlaybackException) e);
|
||||||
|
} else {
|
||||||
|
transformationException = TransformationException.createForUnexpected(e);
|
||||||
|
}
|
||||||
listener.onTransformationError(transformationException);
|
listener.onTransformationError(transformationException);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -181,7 +181,7 @@ import com.google.common.collect.ImmutableList;
|
||||||
encoderFactory,
|
encoderFactory,
|
||||||
muxerWrapper,
|
muxerWrapper,
|
||||||
fallbackListener,
|
fallbackListener,
|
||||||
asyncErrorListener,
|
listener::onTransformationError,
|
||||||
debugViewProvider);
|
debugViewProvider);
|
||||||
} else {
|
} else {
|
||||||
return new PassthroughSamplePipeline(
|
return new PassthroughSamplePipeline(
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ import com.google.android.exoplayer2.Format;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.effect.Presentation;
|
import com.google.android.exoplayer2.effect.Presentation;
|
||||||
import com.google.android.exoplayer2.effect.ScaleToFitTransformation;
|
import com.google.android.exoplayer2.effect.ScaleToFitTransformation;
|
||||||
|
import com.google.android.exoplayer2.util.Consumer;
|
||||||
import com.google.android.exoplayer2.util.DebugViewProvider;
|
import com.google.android.exoplayer2.util.DebugViewProvider;
|
||||||
import com.google.android.exoplayer2.util.Effect;
|
import com.google.android.exoplayer2.util.Effect;
|
||||||
import com.google.android.exoplayer2.util.FrameInfo;
|
import com.google.android.exoplayer2.util.FrameInfo;
|
||||||
|
|
@ -75,7 +76,7 @@ import org.checkerframework.dataflow.qual.Pure;
|
||||||
Codec.EncoderFactory encoderFactory,
|
Codec.EncoderFactory encoderFactory,
|
||||||
MuxerWrapper muxerWrapper,
|
MuxerWrapper muxerWrapper,
|
||||||
FallbackListener fallbackListener,
|
FallbackListener fallbackListener,
|
||||||
Transformer.AsyncErrorListener asyncErrorListener,
|
Consumer<TransformationException> errorConsumer,
|
||||||
DebugViewProvider debugViewProvider)
|
DebugViewProvider debugViewProvider)
|
||||||
throws TransformationException {
|
throws TransformationException {
|
||||||
super(
|
super(
|
||||||
|
|
@ -154,7 +155,7 @@ import org.checkerframework.dataflow.qual.Pure;
|
||||||
checkNotNull(frameProcessor)
|
checkNotNull(frameProcessor)
|
||||||
.setOutputSurfaceInfo(encoderWrapper.getSurfaceInfo(width, height));
|
.setOutputSurfaceInfo(encoderWrapper.getSurfaceInfo(width, height));
|
||||||
} catch (TransformationException exception) {
|
} catch (TransformationException exception) {
|
||||||
asyncErrorListener.onTransformationError(exception);
|
errorConsumer.accept(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -165,7 +166,7 @@ import org.checkerframework.dataflow.qual.Pure;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFrameProcessingError(FrameProcessingException exception) {
|
public void onFrameProcessingError(FrameProcessingException exception) {
|
||||||
asyncErrorListener.onTransformationError(
|
errorConsumer.accept(
|
||||||
TransformationException.createForFrameProcessingException(
|
TransformationException.createForFrameProcessingException(
|
||||||
exception, TransformationException.ERROR_CODE_FRAME_PROCESSING_FAILED));
|
exception, TransformationException.ERROR_CODE_FRAME_PROCESSING_FAILED));
|
||||||
}
|
}
|
||||||
|
|
@ -175,7 +176,7 @@ import org.checkerframework.dataflow.qual.Pure;
|
||||||
try {
|
try {
|
||||||
encoderWrapper.signalEndOfInputStream();
|
encoderWrapper.signalEndOfInputStream();
|
||||||
} catch (TransformationException exception) {
|
} catch (TransformationException exception) {
|
||||||
asyncErrorListener.onTransformationError(exception);
|
errorConsumer.accept(exception);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue