Fix issue with Mp4Writer with massive time scales.
This commit is contained in:
parent
6d657b449c
commit
4a08de370a
2 changed files with 15 additions and 4 deletions
|
@ -74,6 +74,7 @@ import static org.mp4parser.tools.CastUtils.l2i;
|
||||||
final class Mp4Writer extends DefaultBoxes implements SampleSink {
|
final class Mp4Writer extends DefaultBoxes implements SampleSink {
|
||||||
|
|
||||||
private static final String TAG = "Mp4Writer";
|
private static final String TAG = "Mp4Writer";
|
||||||
|
private static final Long UInt32_MAX = (1L << 32) - 1;
|
||||||
|
|
||||||
private final WritableByteChannel sink;
|
private final WritableByteChannel sink;
|
||||||
private final List<StreamingTrack> source;
|
private final List<StreamingTrack> source;
|
||||||
|
@ -165,14 +166,24 @@ final class Mp4Writer extends DefaultBoxes implements SampleSink {
|
||||||
final MediaHeaderBox mdhd = Path.getPath(tb, "mdia[0]/mdhd[0]");
|
final MediaHeaderBox mdhd = Path.getPath(tb, "mdia[0]/mdhd[0]");
|
||||||
mdhd.setCreationTime(creationTime);
|
mdhd.setCreationTime(creationTime);
|
||||||
mdhd.setModificationTime(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.setTimescale(streamingTrack.getTimescale());
|
||||||
mdhd.setLanguage(streamingTrack.getLanguage());
|
mdhd.setLanguage(streamingTrack.getLanguage());
|
||||||
movieBox.addBox(tb);
|
movieBox.addBox(tb);
|
||||||
|
|
||||||
final TrackHeaderBox tkhd = Path.getPath(tb, "tkhd[0]");
|
final TrackHeaderBox tkhd = Path.getPath(tb, "tkhd[0]");
|
||||||
final double duration = (double) Objects.requireNonNull(nextSampleStartTime.get(streamingTrack)) / streamingTrack.getTimescale();
|
final double duration = (double) mediaHeaderDuration / streamingTrack.getTimescale();
|
||||||
tkhd.setDuration((long) (mvhd.getTimescale() * duration));
|
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
|
// metadata here
|
||||||
|
|
|
@ -31,7 +31,7 @@ final class Utils {
|
||||||
}
|
}
|
||||||
|
|
||||||
static @NonNull ByteBuffer subBuffer(final @NonNull ByteBuffer buf, final int start) {
|
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) {
|
static @NonNull ByteBuffer subBuffer(final @NonNull ByteBuffer buf, final int start, final int count) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue