From 5264da59b3718243d88d62f88c08430e08743c77 Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 6 Dec 2021 14:44:51 +0000 Subject: [PATCH] Various small improvements in Transformer PiperOrigin-RevId: 414428415 --- .../transformer/AudioSamplePipeline.java | 44 +++++++++---------- .../media3/transformer/FrameEditor.java | 4 +- .../media3/transformer/SamplePipeline.java | 2 +- .../transformer/TransformerAudioRenderer.java | 18 +++++--- .../transformer/VideoSamplePipeline.java | 32 +++++++------- 5 files changed, 53 insertions(+), 47 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java index c98a858dae..22a6bd7d75 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/AudioSamplePipeline.java @@ -98,12 +98,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } @Override - public void release() { - sonicAudioProcessor.reset(); - decoder.release(); - if (encoder != null) { - encoder.release(); - } + @Nullable + public DecoderInputBuffer dequeueInputBuffer() { + return decoder.maybeDequeueInputBuffer(decoderInputBuffer) ? decoderInputBuffer : null; + } + + @Override + public void queueInputBuffer() { + decoder.queueInputBuffer(decoderInputBuffer); } @Override @@ -118,28 +120,12 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } } - @Override - @Nullable - public DecoderInputBuffer dequeueInputBuffer() { - return decoder.maybeDequeueInputBuffer(decoderInputBuffer) ? decoderInputBuffer : null; - } - - @Override - public void queueInputBuffer() { - decoder.queueInputBuffer(decoderInputBuffer); - } - @Override @Nullable public Format getOutputFormat() { return encoder != null ? encoder.getOutputFormat() : null; } - @Override - public boolean isEnded() { - return encoder != null && encoder.isEnded(); - } - @Override @Nullable public DecoderInputBuffer getOutputBuffer() { @@ -159,6 +145,20 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; checkStateNotNull(encoder).releaseOutputBuffer(); } + @Override + public boolean isEnded() { + return encoder != null && encoder.isEnded(); + } + + @Override + public void release() { + sonicAudioProcessor.reset(); + decoder.release(); + if (encoder != null) { + encoder.release(); + } + } + /** * Attempts to pass decoder output data to the encoder, and returns whether it may be possible to * pass more data immediately by calling this method again. diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/FrameEditor.java b/libraries/transformer/src/main/java/androidx/media3/transformer/FrameEditor.java index 687e5850b9..dc82f565cb 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/FrameEditor.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/FrameEditor.java @@ -100,7 +100,7 @@ import java.io.IOException; * Returns a 4x4, column-major Matrix float array, from an input {@link Matrix}. This is useful * for converting to the 4x4 column-major format commonly used in OpenGL. */ - private static final float[] getGlMatrixArray(Matrix matrix) { + private static float[] getGlMatrixArray(Matrix matrix) { float[] matrix3x3Array = new float[9]; matrix.getValues(matrix3x3Array); float[] matrix4x4Array = getMatrix4x4Array(matrix3x3Array); @@ -123,7 +123,7 @@ import java.io.IOException; * Input format: [a, b, c, d, e, f, g, h, i]
* Output format: [a, b, 0, c, d, e, 0, f, 0, 0, 1, 0, g, h, 0, i] */ - private static final float[] getMatrix4x4Array(float[] matrix3x3Array) { + private static float[] getMatrix4x4Array(float[] matrix3x3Array) { float[] matrix4x4Array = new float[16]; matrix4x4Array[10] = 1; for (int inputRow = 0; inputRow < 3; inputRow++) { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java index e280841c82..f647320884 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SamplePipeline.java @@ -41,7 +41,7 @@ import androidx.media3.exoplayer.ExoPlaybackException; void queueInputBuffer(); /** - * Process the input data and returns whether more data can be processed by calling this method + * Processes the input data and returns whether more data can be processed by calling this method * again. */ boolean processData() throws ExoPlaybackException; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java index f3a2a1af24..c1d0f2f1ed 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerAudioRenderer.java @@ -60,12 +60,7 @@ import androidx.media3.extractor.metadata.mp4.SlowMotionData; return false; } Format inputFormat = checkNotNull(formatHolder.format); - boolean shouldChangeMimeType = - transformation.audioMimeType != null - && !transformation.audioMimeType.equals(inputFormat.sampleMimeType); - boolean shouldFlattenForSlowMotion = - transformation.flattenForSlowMotion && isSlowMotion(inputFormat); - if (shouldChangeMimeType || shouldFlattenForSlowMotion) { + if (shouldTranscode(inputFormat)) { samplePipeline = new AudioSamplePipeline(inputFormat, transformation, getIndex()); } else { samplePipeline = new PassthroughSamplePipeline(inputFormat); @@ -73,6 +68,17 @@ import androidx.media3.extractor.metadata.mp4.SlowMotionData; return true; } + private boolean shouldTranscode(Format inputFormat) { + if (transformation.audioMimeType != null + && !transformation.audioMimeType.equals(inputFormat.sampleMimeType)) { + return true; + } + if (transformation.flattenForSlowMotion && isSlowMotion(inputFormat)) { + return true; + } + return false; + } + private static boolean isSlowMotion(Format format) { @Nullable Metadata metadata = format.metadata; if (metadata == null) { diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java index c24b814679..b6fc1a119b 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoSamplePipeline.java @@ -102,6 +102,17 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } + @Override + @Nullable + public DecoderInputBuffer dequeueInputBuffer() { + return decoder.maybeDequeueInputBuffer(decoderInputBuffer) ? decoderInputBuffer : null; + } + + @Override + public void queueInputBuffer() { + decoder.queueInputBuffer(decoderInputBuffer); + } + @Override public boolean processData() { if (decoder.isEnded()) { @@ -131,28 +142,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; return decoderHasOutputBuffer && !waitingForFrameEditorInput; } - @Override - @Nullable - public DecoderInputBuffer dequeueInputBuffer() { - return decoder.maybeDequeueInputBuffer(decoderInputBuffer) ? decoderInputBuffer : null; - } - - @Override - public void queueInputBuffer() { - decoder.queueInputBuffer(decoderInputBuffer); - } - @Override @Nullable public Format getOutputFormat() { return encoder.getOutputFormat(); } - @Override - public boolean isEnded() { - return encoder.isEnded(); - } - @Override @Nullable public DecoderInputBuffer getOutputBuffer() { @@ -171,6 +166,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; encoder.releaseOutputBuffer(); } + @Override + public boolean isEnded() { + return encoder.isEnded(); + } + @Override public void release() { if (frameEditor != null) {