diff --git a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java index e2829defcd..8810495706 100644 --- a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java +++ b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java @@ -114,11 +114,13 @@ public final class TransformerActivity extends AppCompatActivity { protected void onStop() { super.onStop(); - checkNotNull(transformationStopwatch).reset(); - checkNotNull(transformer).cancel(); transformer = null; + // The stop watch is reset after cancelling the transformation, in case cancelling causes the + // stop watch to be stopped in a transformer callback. + checkNotNull(transformationStopwatch).reset(); + checkNotNull(playerView).onPause(); releasePlayer(); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java index 0e1572a8c7..8b26a65dcb 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/Transformer.java @@ -518,6 +518,7 @@ public final class Transformer { @Nullable private MuxerWrapper muxerWrapper; @Nullable private ExoPlayer player; private @ProgressState int progressState; + private boolean isCancelling; private Transformer( Context context, @@ -736,11 +737,13 @@ public final class Transformer { * @throws IllegalStateException If this method is called from the wrong thread. */ public void cancel() { + isCancelling = true; try { releaseResources(/* forCancellation= */ true); } catch (TransformationException impossible) { throw new IllegalStateException(impossible); } + isCancelling = false; } /** @@ -898,10 +901,19 @@ public final class Transformer { @Override public void onPlayerError(PlaybackException error) { @Nullable Throwable cause = error.getCause(); - handleTransformationEnded( + TransformationException transformationException = cause instanceof TransformationException ? (TransformationException) cause - : TransformationException.createForPlaybackException(error)); + : TransformationException.createForPlaybackException(error); + if (isCancelling) { + // Resources are already being released. + listeners.queueEvent( + /* eventFlag= */ C.INDEX_UNSET, + listener -> listener.onTransformationError(mediaItem, transformationException)); + listeners.flushEvents(); + } else { + handleTransformationEnded(transformationException); + } } private void handleTransformationEnded(@Nullable TransformationException exception) {