From 4a08de370a7b59b44345c154fcbd422aeda8a889 Mon Sep 17 00:00:00 2001 From: Nicholas Tinsley Date: Tue, 30 Apr 2024 16:20:04 -0400 Subject: [PATCH] Fix issue with Mp4Writer with massive time scales. --- .../video/videoconverter/muxer/Mp4Writer.java | 17 ++++++++++++++--- .../video/videoconverter/muxer/Utils.java | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Mp4Writer.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Mp4Writer.java index 4be1a19280..7b13c42c4b 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Mp4Writer.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Mp4Writer.java @@ -74,6 +74,7 @@ import static org.mp4parser.tools.CastUtils.l2i; final class Mp4Writer extends DefaultBoxes implements SampleSink { private static final String TAG = "Mp4Writer"; + private static final Long UInt32_MAX = (1L << 32) - 1; private final WritableByteChannel sink; private final List source; @@ -165,14 +166,24 @@ final class Mp4Writer extends DefaultBoxes implements SampleSink { final MediaHeaderBox mdhd = Path.getPath(tb, "mdia[0]/mdhd[0]"); mdhd.setCreationTime(creationTime); mdhd.setModificationTime(creationTime); - mdhd.setDuration(Objects.requireNonNull(nextSampleStartTime.get(streamingTrack))); + final Long mediaHeaderDuration = Objects.requireNonNull(nextSampleStartTime.get(streamingTrack)); + if (mediaHeaderDuration >= UInt32_MAX) { + mdhd.setVersion(1); + } + mdhd.setDuration(mediaHeaderDuration); mdhd.setTimescale(streamingTrack.getTimescale()); mdhd.setLanguage(streamingTrack.getLanguage()); movieBox.addBox(tb); final TrackHeaderBox tkhd = Path.getPath(tb, "tkhd[0]"); - final double duration = (double) Objects.requireNonNull(nextSampleStartTime.get(streamingTrack)) / streamingTrack.getTimescale(); - tkhd.setDuration((long) (mvhd.getTimescale() * duration)); + final double duration = (double) mediaHeaderDuration / streamingTrack.getTimescale(); + tkhd.setCreationTime(creationTime); + tkhd.setModificationTime(creationTime); + final long trackHeaderDuration = (long) (mvhd.getTimescale() * duration); + if (trackHeaderDuration >= UInt32_MAX) { + tkhd.setVersion(1); + } + tkhd.setDuration(trackHeaderDuration); } // metadata here diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Utils.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Utils.java index 02f4c9a1c8..a850fdae3c 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Utils.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/Utils.java @@ -31,7 +31,7 @@ final class Utils { } static @NonNull ByteBuffer subBuffer(final @NonNull ByteBuffer buf, final int start) { - return subBuffer(buf, start, buf.remaining() - start); + return subBuffer(buf, start, buf.limit() - start); } static @NonNull ByteBuffer subBuffer(final @NonNull ByteBuffer buf, final int start, final int count) {