diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java index 5c17af7fb2..69eeef217a 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java @@ -237,6 +237,9 @@ public final class Mp4Muxer { /** * Writes encoded sample data. * + *

The samples are cached and are written in batches so the caller must not change/release the + * {@link ByteBuffer} and the {@link BufferInfo} after calling this method. + * * @param trackToken The {@link TrackToken} for which this sample is being written. * @param byteBuffer The encoded sample. * @param bufferInfo The {@link BufferInfo} related to this sample. diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java index ce42aee2bb..e4a78b983b 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java @@ -379,19 +379,7 @@ import java.util.concurrent.atomic.AtomicBoolean; // Skip empty samples. // TODO: b/279931840 - Confirm whether muxer should throw when writing empty samples. if (byteBuffer.remaining() > 0) { - // Copy sample data and release the original buffer. - ByteBuffer byteBufferCopy = ByteBuffer.allocateDirect(byteBuffer.remaining()); - byteBufferCopy.put(byteBuffer); - byteBufferCopy.rewind(); - - BufferInfo bufferInfoCopy = new BufferInfo(); - bufferInfoCopy.set( - /* newOffset= */ byteBufferCopy.position(), - /* newSize= */ byteBufferCopy.remaining(), - bufferInfo.presentationTimeUs, - bufferInfo.flags); - - pendingSamples.addLast(Pair.create(bufferInfoCopy, byteBufferCopy)); + pendingSamples.addLast(Pair.create(bufferInfo, byteBuffer)); doInterleave(); } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java index be50452c25..5fbc1b3b04 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/InAppMuxer.java @@ -165,7 +165,19 @@ public final class InAppMuxer implements Muxer { data.position(), size, presentationTimeUs, TransformerUtil.getMediaCodecFlags(flags)); try { - mp4Muxer.writeSampleData(trackTokenList.get(trackIndex), data, bufferInfo); + // Copy sample data and release the original buffer. + ByteBuffer byteBufferCopy = ByteBuffer.allocateDirect(data.remaining()); + byteBufferCopy.put(data); + byteBufferCopy.rewind(); + + BufferInfo bufferInfoCopy = new BufferInfo(); + bufferInfoCopy.set( + /* newOffset= */ byteBufferCopy.position(), + /* newSize= */ byteBufferCopy.remaining(), + bufferInfo.presentationTimeUs, + bufferInfo.flags); + + mp4Muxer.writeSampleData(trackTokenList.get(trackIndex), byteBufferCopy, bufferInfoCopy); } catch (IOException e) { throw new MuxerException( "Failed to write sample for trackIndex="