From f4766ee4db69e6f501e40701865ae99b117d9f0b Mon Sep 17 00:00:00 2001 From: kimvde Date: Tue, 21 Feb 2023 13:50:20 +0000 Subject: [PATCH] Fix clipping in AudioSamplePipeline When clipping a MediaItem with start time > 0, the audio was ending before the video. This is because: - Audio timestamps are computed based on the sample sizes, with a start time set to streamOffsetUs (i.e. the streamStartPositionUs is not taken into account). - The SamplePipeline was subtracting streamStartPositionUs from the timestamps before sending the samples to the muxer. - As a result, the audio timestamps were shifted by streamStartPositionUs, while they should be shifter by streamOffsetUs. PiperOrigin-RevId: 511175923 --- .../android/exoplayer2/transformer/AudioSamplePipeline.java | 3 +-- .../android/exoplayer2/transformer/CompositeAssetLoader.java | 2 +- .../android/exoplayer2/transformer/TransformerInternal.java | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/AudioSamplePipeline.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/AudioSamplePipeline.java index 3e003fa3d3..75c0863206 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/AudioSamplePipeline.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/AudioSamplePipeline.java @@ -60,7 +60,6 @@ import org.checkerframework.dataflow.qual.Pure; // TODO(b/260618558): Move silent audio generation upstream of this component. public AudioSamplePipeline( Format firstInputFormat, - long streamStartPositionUs, long streamOffsetUs, TransformationRequest transformationRequest, boolean flattenForSlowMotion, @@ -69,7 +68,7 @@ import org.checkerframework.dataflow.qual.Pure; MuxerWrapper muxerWrapper, FallbackListener fallbackListener) throws ExportException { - super(firstInputFormat, streamStartPositionUs, muxerWrapper); + super(firstInputFormat, /* streamStartPositionUs= */ streamOffsetUs, muxerWrapper); silentAudioGenerator = new SilentAudioGenerator(firstInputFormat); availableInputBuffers = new ConcurrentLinkedDeque<>(); diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/CompositeAssetLoader.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/CompositeAssetLoader.java index ac9dcd28a2..895bdbbd63 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/CompositeAssetLoader.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/CompositeAssetLoader.java @@ -196,7 +196,7 @@ import java.util.concurrent.atomic.AtomicInteger; compositeAssetLoaderListener.onTrackAdded( firstAudioFormat, SUPPORTED_OUTPUT_TYPE_DECODED, - /* streamStartPositionUs= */ streamOffsetUs, + streamStartPositionUs, streamOffsetUs)); sampleConsumersByTrackType.put(C.TRACK_TYPE_AUDIO, audioSampleConsumer); } diff --git a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerInternal.java b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerInternal.java index c27c019959..29a10623a8 100644 --- a/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerInternal.java +++ b/library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerInternal.java @@ -434,7 +434,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; if (MimeTypes.isAudio(firstInputFormat.sampleMimeType)) { return new AudioSamplePipeline( firstInputFormat, - streamStartPositionUs, streamOffsetUs, transformationRequest, firstEditedMediaItem.flattenForSlowMotion,