From 1dbb19a44cf5f9ed448d9232cd7e9e704c43cba1 Mon Sep 17 00:00:00 2001 From: kimvde Date: Tue, 28 Mar 2023 15:33:38 +0000 Subject: [PATCH] Rollback of https://github.com/androidx/media/commit/7e6236cfdb8c0ebbfe6ed3b3d0d3ea1417632782 *** Original commit *** Rollback of https://github.com/androidx/media/commit/fc539da0613d8703e2176fe5aa225df8cefb9c8f *** Original commit *** Release SequenceAssetLoader when ended Before, the SequenceAssetLoader was released at the end of the export. Release resources earlier if possible. *** *** PiperOrigin-RevId: 520036433 --- .../transformer/SequenceAssetLoader.java | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java index 700e956e32..638ba4baf7 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SequenceAssetLoader.java @@ -94,6 +94,7 @@ import java.util.concurrent.atomic.AtomicInteger; private boolean audioLoopingEnded; private boolean videoLoopingEnded; private int processedInputsSize; + private boolean released; private volatile long currentAssetDurationUs; @@ -165,7 +166,10 @@ import java.util.concurrent.atomic.AtomicInteger; @Override public void release() { - currentAssetLoader.release(); + if (!released) { + currentAssetLoader.release(); + released = true; + } } /** @@ -368,13 +372,15 @@ import java.util.concurrent.atomic.AtomicInteger; long globalTimestampUs = totalDurationUs + inputBuffer.timeUs - currentAssetStartTimeUs; if (isLooping && globalTimestampUs >= maxSequenceDurationUs) { if (isMaxSequenceDurationUsFinal && !audioLoopingEnded) { - nonEndedTracks.decrementAndGet(); checkNotNull(inputBuffer.data).limit(0); inputBuffer.setFlags(C.BUFFER_FLAG_END_OF_STREAM); // We know that queueInputBuffer() will always return true for the underlying // SampleConsumer so there is no need to handle the case where the sample wasn't queued. checkState(sampleConsumer.queueInputBuffer()); audioLoopingEnded = true; + if (nonEndedTracks.decrementAndGet() == 0) { + release(); + } } return false; } @@ -387,8 +393,13 @@ import java.util.concurrent.atomic.AtomicInteger; if (nonEndedTracks.get() == 0) { switchAssetLoader(); } - return true; + } else { + checkState(sampleConsumer.queueInputBuffer()); + if (nonEndedTracks.get() == 0) { + release(); + } } + return true; } checkState(sampleConsumer.queueInputBuffer()); @@ -448,13 +459,17 @@ import java.util.concurrent.atomic.AtomicInteger; @Override public void signalEndOfVideoInput() { - nonEndedTracks.decrementAndGet(); boolean videoEnded = isLooping ? videoLoopingEnded : currentMediaItemIndex == editedMediaItems.size() - 1; if (videoEnded) { sampleConsumer.signalEndOfVideoInput(); - } else if (nonEndedTracks.get() == 0) { - switchAssetLoader(); + } + if (nonEndedTracks.decrementAndGet() == 0) { + if (videoEnded) { + release(); + } else { + switchAssetLoader(); + } } } @@ -479,5 +494,9 @@ import java.util.concurrent.atomic.AtomicInteger; currentAssetLoader.start(); }); } + + private void release() { + handler.post(SequenceAssetLoader.this::release); + } } }