From beed1bd76e51adc8f6271cf2a773d6b5a067c37c Mon Sep 17 00:00:00 2001 From: tofunmi Date: Tue, 24 Oct 2023 07:36:22 -0700 Subject: [PATCH] Pass initial timestamp offset to EncodedSampleExporter When transmuxing, we usually only need to offset the timestamp by the position of a mediaItem in a sequence. Trim optimization introduces another type of offset: for the transmux of the second part of the video we need to offset the timestamps by the total duration already trancoded by transformer. PiperOrigin-RevId: 576134656 --- .../androidx/media3/transformer/EncodedSampleExporter.java | 7 +++++-- .../androidx/media3/transformer/TransformerInternal.java | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java b/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java index f32268f07d..f0c0e8b1ac 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/EncodedSampleExporter.java @@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicLong; private static final int MAX_INPUT_BUFFER_COUNT = 10; private final Format format; + private final long initialTimestampOffsetUs; private final AtomicLong nextMediaItemOffsetUs; private final Queue availableInputBuffers; private final Queue pendingInputBuffers; @@ -45,9 +46,11 @@ import java.util.concurrent.atomic.AtomicLong; Format format, TransformationRequest transformationRequest, MuxerWrapper muxerWrapper, - FallbackListener fallbackListener) { + FallbackListener fallbackListener, + long initialTimestampOffsetUs) { super(format, muxerWrapper); this.format = format; + this.initialTimestampOffsetUs = initialTimestampOffsetUs; nextMediaItemOffsetUs = new AtomicLong(); availableInputBuffers = new ConcurrentLinkedDeque<>(); ByteBuffer emptyBuffer = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder()); @@ -82,7 +85,7 @@ import java.util.concurrent.atomic.AtomicLong; if (inputBuffer.isEndOfStream()) { inputEnded = true; } else { - inputBuffer.timeUs += mediaItemOffsetUs; + inputBuffer.timeUs += mediaItemOffsetUs + initialTimestampOffsetUs; pendingInputBuffers.add(inputBuffer); } return true; diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java index 454372804c..90771f496f 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/TransformerInternal.java @@ -617,7 +617,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; assetLoaderInputTracker.getAssetLoaderInputFormat(sequenceIndex, trackType), transformationRequest, muxerWrapper, - fallbackListener)); + fallbackListener, + videoSampleTimestampOffsetUs)); } /**