From 041c3e9971b6a1c9446b485afd40f31196865b94 Mon Sep 17 00:00:00 2001 From: hschlueter Date: Fri, 26 Nov 2021 14:47:27 +0000 Subject: [PATCH] Use audio passthrough if flattening is requested but not needed. When the input is not a slow motion video, then flattening should do nothing, so there is no need to re-encode audio. PiperOrigin-RevId: 412443097 --- .../transformer/TransformerAudioRenderer.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java index e1a2d35f0d..07bd1f0db8 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerAudioRenderer.java @@ -19,12 +19,15 @@ package com.google.android.exoplayer2.transformer; import static com.google.android.exoplayer2.source.SampleStream.FLAG_REQUIRE_FORMAT; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.decoder.DecoderInputBuffer; +import com.google.android.exoplayer2.metadata.Metadata; +import com.google.android.exoplayer2.metadata.mp4.SlowMotionData; import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; @RequiresApi(18) @@ -59,13 +62,29 @@ import com.google.android.exoplayer2.source.SampleStream.ReadDataResult; return false; } Format inputFormat = checkNotNull(formatHolder.format); - if ((transformation.audioMimeType != null - && !transformation.audioMimeType.equals(inputFormat.sampleMimeType)) - || transformation.flattenForSlowMotion) { + boolean shouldChangeMimeType = + transformation.audioMimeType != null + && !transformation.audioMimeType.equals(inputFormat.sampleMimeType); + boolean shouldFlattenForSlowMotion = + transformation.flattenForSlowMotion && isSlowMotion(inputFormat); + if (shouldChangeMimeType || shouldFlattenForSlowMotion) { samplePipeline = new AudioSamplePipeline(inputFormat, transformation, getIndex()); } else { samplePipeline = new PassthroughSamplePipeline(inputFormat); } return true; } + + private static boolean isSlowMotion(Format format) { + @Nullable Metadata metadata = format.metadata; + if (metadata == null) { + return false; + } + for (int i = 0; i < metadata.length(); i++) { + if (metadata.get(i) instanceof SlowMotionData) { + return true; + } + } + return false; + } }