From f60d2b41467d9fcc7562bece1b0297a3d9d85b06 Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 4 Dec 2024 19:19:39 -0800 Subject: [PATCH] Rollback of https://github.com/androidx/media/commit/66e8b53b43c9d53fde4922cd46023f9b5ef8bebc PiperOrigin-RevId: 702943864 --- .../audio/SpeedChangingAudioProcessor.java | 60 +++++++------------ .../SpeedChangingAudioProcessorTest.java | 22 ------- 2 files changed, 21 insertions(+), 61 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java b/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java index ac8f9ca05a..e2e1eb8e71 100644 --- a/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java +++ b/libraries/common/src/main/java/androidx/media3/common/audio/SpeedChangingAudioProcessor.java @@ -24,6 +24,7 @@ import static androidx.media3.common.util.Util.sampleCountToDurationUs; import static java.lang.Math.min; import static java.lang.Math.round; +import android.annotation.SuppressLint; import androidx.annotation.GuardedBy; import androidx.annotation.IntRange; import androidx.media3.common.C; @@ -44,8 +45,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; /** * An {@link AudioProcessor} that changes the speed of audio samples depending on their timestamp. */ +// TODO(b/288221200): Consider making the processor inactive and skipping it in the processor chain +// when speed is 1. @UnstableApi -public final class SpeedChangingAudioProcessor implements AudioProcessor { +public final class SpeedChangingAudioProcessor extends BaseAudioProcessor { private final Object lock; @@ -94,18 +97,7 @@ public final class SpeedChangingAudioProcessor implements AudioProcessor { private boolean endOfStreamQueuedToSonic; - /** The current input audio format. */ - private AudioFormat inputAudioFormat; - - private AudioFormat pendingInputAudioFormat; - private AudioFormat pendingOutputAudioFormat; - private boolean inputEnded; - public SpeedChangingAudioProcessor(SpeedProvider speedProvider) { - pendingInputAudioFormat = AudioFormat.NOT_SET; - pendingOutputAudioFormat = AudioFormat.NOT_SET; - inputAudioFormat = AudioFormat.NOT_SET; - this.speedProvider = speedProvider; lock = new Object(); sonicAudioProcessor = @@ -113,7 +105,7 @@ public final class SpeedChangingAudioProcessor implements AudioProcessor { pendingCallbackInputTimesUs = new LongArrayQueue(); pendingCallbacks = new ArrayDeque<>(); speedAdjustedTimeAsyncInputTimeUs = C.TIME_UNSET; - resetInternalState(); + resetState(); } /** Returns the estimated number of samples output given the provided parameters. */ @@ -152,23 +144,17 @@ public final class SpeedChangingAudioProcessor implements AudioProcessor { return outputSamples; } - @Override - public AudioFormat configure(AudioFormat inputAudioFormat) throws UnhandledAudioFormatException { - pendingInputAudioFormat = inputAudioFormat; - pendingOutputAudioFormat = sonicAudioProcessor.configure(inputAudioFormat); - return pendingOutputAudioFormat; - } - - @Override - public boolean isActive() { - return !pendingOutputAudioFormat.equals(AudioFormat.NOT_SET); - } - @Override public long getDurationAfterProcessorApplied(long durationUs) { return SpeedProviderUtil.getDurationAfterSpeedProviderApplied(speedProvider, durationUs); } + @Override + public AudioFormat onConfigure(AudioFormat inputAudioFormat) + throws UnhandledAudioFormatException { + return sonicAudioProcessor.configure(inputAudioFormat); + } + @Override public void queueInput(ByteBuffer inputBuffer) { long currentTimeUs = sampleCountToDurationUs(framesRead, inputAudioFormat.sampleRate); @@ -205,14 +191,15 @@ public final class SpeedChangingAudioProcessor implements AudioProcessor { } @Override - public void queueEndOfStream() { - inputEnded = true; + protected void onQueueEndOfStream() { if (!endOfStreamQueuedToSonic) { sonicAudioProcessor.queueEndOfStream(); endOfStreamQueuedToSonic = true; } } + // Not using BaseAudioProcessor's buffers. + @SuppressLint("MissingSuperCall") @Override public ByteBuffer getOutput() { ByteBuffer output = sonicAudioProcessor.getOutput(); @@ -222,24 +209,18 @@ public final class SpeedChangingAudioProcessor implements AudioProcessor { @Override public boolean isEnded() { - return inputEnded && sonicAudioProcessor.isEnded(); + return super.isEnded() && sonicAudioProcessor.isEnded(); } @Override - public void flush() { - inputEnded = false; - inputAudioFormat = pendingInputAudioFormat; - resetInternalState(); + protected void onFlush() { + resetState(); sonicAudioProcessor.flush(); } @Override - public void reset() { - flush(); - pendingInputAudioFormat = AudioFormat.NOT_SET; - pendingOutputAudioFormat = AudioFormat.NOT_SET; - inputAudioFormat = AudioFormat.NOT_SET; - resetInternalState(); + protected void onReset() { + resetState(); sonicAudioProcessor.reset(); } @@ -371,6 +352,7 @@ public final class SpeedChangingAudioProcessor implements AudioProcessor { // Invalidate any previously created buffers in SonicAudioProcessor and the base class. sonicAudioProcessor.flush(); endOfStreamQueuedToSonic = false; + super.getOutput(); } } } @@ -414,7 +396,7 @@ public final class SpeedChangingAudioProcessor implements AudioProcessor { @EnsuresNonNull({"inputSegmentStartTimesUs", "outputSegmentStartTimesUs"}) @RequiresNonNull("lock") - private void resetInternalState(@UnknownInitialization SpeedChangingAudioProcessor this) { + private void resetState(@UnknownInitialization SpeedChangingAudioProcessor this) { synchronized (lock) { inputSegmentStartTimesUs = new LongArray(); outputSegmentStartTimesUs = new LongArray(); diff --git a/libraries/common/src/test/java/androidx/media3/common/audio/SpeedChangingAudioProcessorTest.java b/libraries/common/src/test/java/androidx/media3/common/audio/SpeedChangingAudioProcessorTest.java index 824ffc6451..c95aff64bd 100644 --- a/libraries/common/src/test/java/androidx/media3/common/audio/SpeedChangingAudioProcessorTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/audio/SpeedChangingAudioProcessorTest.java @@ -701,28 +701,6 @@ public class SpeedChangingAudioProcessorTest { /* speedProvider= */ null, AUDIO_FORMAT.sampleRate, /* inputSamples= */ 1000L)); } - @Test - public void isActive_beforeConfigure_returnsFalse() { - SpeedProvider speedProvider = - TestSpeedProvider.createWithFrameCounts( - AUDIO_FORMAT, /* frameCounts= */ new int[] {1000}, /* speeds= */ new float[] {2f}); - - SpeedChangingAudioProcessor processor = new SpeedChangingAudioProcessor(speedProvider); - assertThat(processor.isActive()).isFalse(); - } - - @Test - public void isActive_afterConfigure_returnsTrue() - throws AudioProcessor.UnhandledAudioFormatException { - SpeedProvider speedProvider = - TestSpeedProvider.createWithFrameCounts( - AUDIO_FORMAT, /* frameCounts= */ new int[] {1000}, /* speeds= */ new float[] {2f}); - - SpeedChangingAudioProcessor processor = new SpeedChangingAudioProcessor(speedProvider); - processor.configure(AUDIO_FORMAT); - assertThat(processor.isActive()).isTrue(); - } - private static SpeedChangingAudioProcessor getConfiguredSpeedChangingAudioProcessor( SpeedProvider speedProvider) throws AudioProcessor.UnhandledAudioFormatException { SpeedChangingAudioProcessor speedChangingAudioProcessor =